NumPy - 陣列步長



NumPy 陣列步長

在 NumPy 中,步長 是整數元組,表示遍歷陣列時每個維度需要跨越的位元組數。它提供了訪問陣列中的元素而無需顯式複製資料的能力。

步長是根據陣列的形狀和資料型別計算得出的 -

  • 對於資料型別為 4 位元組(例如,int32)的一維陣列,步長只是資料型別的大小。
  • 對於多維陣列,步長是透過將內部維度的尺寸乘以前一維度的步長來計算的。

在 NumPy 中訪問步長

您可以使用strides 屬性訪問 NumPy 陣列的步長。此屬性返回一個元組,其中每個值表示在記憶體中移動以訪問沿每個維度下一個元素所需的位元組數。

示例

在以下示例中,我們使用 NumPy 的“stride”屬性計算陣列的步長 -

import numpy as np

# Creating a 2D array
array = np.array([[1, 2, 3], [4, 5, 6]])

# Accessing the strides
print("Array strides:", array.strides)

步長 (24, 8) 表示要從一行移動到下一行,跳過 24 個位元組;要從一列移動到下一列,跳過 8 個位元組 -

Array strides: (24, 8)

NumPy 步長的工作原理

步長是根據陣列的形狀和資料型別計算的。對於給定的維度,步長是元素大小(以位元組為單位)和後續維度中元素數量的乘積。

對於形狀為(m, n) 且資料型別為dtype 的二維陣列 -

  • 第一維度的步長:stride[0] = n * size_of(dtype)
  • 第二維度的步長:stride[1] = size_of(dtype)

示例:基本步長

在下面的示例中,我們訪問基本一維 NumPy 陣列的步長 -

import numpy as np

# Creating a 1D array
array_1d = np.array([1, 2, 3, 4, 5])

# Accessing strides
print("1D Array strides:", array_1d.strides)

步長 (8,) 表示每個元素在記憶體中相隔 8 個位元組,這對於整數陣列來說很常見 -

1D Array strides: (8,)

示例:更改步長

轉置陣列會更改步長,反映新的記憶體佈局,如下面的示例所示 -

import numpy as np

# Creating a 2D array
array_2d = np.array([[1, 2, 3], [4, 5, 6]])

# Transposing the array
array_2d_T = array_2d.T

# Accessing strides
print("Original array strides:", array_2d.strides)
print("Transposed array strides:", array_2d_T.strides)

步長 (8,) 表示每個元素在記憶體中相隔 8 個位元組,這對於整數陣列來說很常見 -

Original array strides: (24, 8)
Transposed array strides: (8, 24)

示例:使用步長最佳化記憶體

使用步長可以透過允許高效的訪問模式來幫助最佳化記憶體使用 -

import numpy as np

# Creating a large array
large_array = np.zeros((1000, 1000))

# Accessing every 10th row
strided_array = large_array[::10, :]

print("Strided array shape:", strided_array.shape)
print("Strided array strides:", strided_array.strides)

步長表示我們正在跳過 80,000 個位元組(10 行)以訪問下一行,從而最佳化記憶體訪問 -

Strided array shape: (100, 1000)
Strided array strides: (80000, 8)

多維陣列中的步長

多維陣列中的步長工作方式類似,每個步長值表示相應維度的位元組步長。

對於多維陣列,每個維度的步長是元素大小與後續維度大小的累積乘積的乘積。

這意味著最後一維的步長只是資料型別的大小,倒數第二維的步長是最後一維的大小乘以資料型別的大小,依此類推。

示例

在下面的示例中,我們計算三維陣列的步長 -

import numpy as np

# Creating a 3D array
array_3d = np.zeros((2, 3, 4))

# Accessing strides
print("3D Array strides:", array_3d.strides)

獲得的步長顯示了每個維度的位元組步長 -

3D Array strides: (96, 32, 8)

切片操作的步長

在執行 NumPy 陣列的切片操作時,步長非常有用。當您對 NumPy 陣列進行切片時,通常會建立一個數組的檢視而不是副本。此檢視共享相同的基礎資料,但可能具有不同的形狀或記憶體佈局。

步長決定在記憶體中跨越多少位元組才能沿著每個維度從一個元素移動到下一個元素。透過調整步長,您可以有效地訪問特定模式的資料。

NumPy 中的切片操作允許您提取陣列的子集,從單個元素到特定部分,而無需複製基礎資料。

示例

在此示例中,我們建立了一個大型二維陣列,並使用帶步長的切片操作訪問每第 10 行,而無需複製資料 -

import numpy as np

# Creating a large 2D array
large_array = np.arange(10000).reshape((100, 100))

# Accessing every 10th row
strided_array = large_array[::10, :]

print("Original array shape:", large_array.shape)
print("Strided array shape:", strided_array.shape)
print("Strided array strides:", strided_array.strides)

以下是獲得的輸出 -

Original array shape: (100, 100)
Strided array shape: (10, 100)
Strided array strides: (4000, 40)
廣告