NumPy - Ndarray 物件



NumPy ndarray

NumPy 中定義的最重要的物件是稱為ndarray的 N 維陣列型別。它描述了一個相同型別項的集合,可以使用基於零的索引訪問這些項。

ndarray 中的每個項在記憶體中佔用相同大小的塊,並由稱為dtype的資料型別物件表示。

從 ndarray 物件(透過切片)提取的任何項都由陣列標量型別之一的 Python 物件表示。

ndarray、dtype 和陣列標量型別之間的關係

下圖顯示了ndarray、資料型別物件dtype和陣列標量型別之間的關係:

Ndarray

建立 ndarray

可以使用不同的陣列建立例程構造 ndarray 類的例項。基本的 ndarray 使用 NumPy 中的array()函式建立。

numpy.array()函式從公開陣列介面的任何物件或從返回陣列的任何方法建立 ndarray。以下是語法:

numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)

上述建構函式採用以下引數:

序號 引數和描述
1

object

任何公開陣列介面方法並返回陣列的物件,或任何(巢狀的)序列。

2

dtype

所需的陣列資料型別,可選

3

copy

可選。預設情況下(true),物件會被複制

4

order

C(行主序)或 F(列主序)或 A(任意)(預設)

5

subok

預設情況下,返回的陣列強制為基類陣列。如果為 true,則子類將被傳遞

6

ndmin

指定結果陣列的最小維度

請檢視以下示例以更好地理解。

示例:建立一維陣列

在以下示例中,我們使用 NumPy 中的 array() 函式建立了一個一維陣列:

import numpy as np
a = np.array([1, 2, 3])
print(a)

獲得的輸出如下:

[1, 2, 3]

示例:建立多維陣列

在這裡,我們使用 NumPy 中的 array() 函式建立了一個二維陣列:

import numpy as np
a = np.array([[1, 2], [3, 4]])
print(a)

這將產生以下結果:

[[1 2]
 [3 4]]

示例:指定最小維度

現在,我們透過將“ndmin”作為引數傳遞給 array() 函式來指定結果陣列的最小維度:

import numpy as np
a = np.array([1, 2, 3, 4, 5], ndmin=2)
print(a)

以下是上述程式碼的輸出:

[[1 2 3 4 5]]

示例:指定資料型別

在下面的示例中,我們將 array() 函式中的“dtype”引數設定為 complex:

import numpy as np
a = np.array([1, 2, 3], dtype=complex)
print(a)

執行上述程式碼後,我們得到以下輸出:

[1.+0.j 2.+0.j 3.+0.j]

ndarray 的記憶體佈局

一個ndarray物件由一個連續的記憶體塊組成。這意味著陣列中的所有元素都儲存在記憶體的單個連續段中。這種連續的記憶體佈局允許輕鬆訪問和運算元組元素。

索引方案

索引方案將 ndarray 中的每個項對映到記憶體塊中的特定位置。ndarray 使用形狀和步長的組合來確定每個元素的位置。

  • 形狀 - 陣列的形狀是一個整數元組,表示陣列沿每個維度的尺寸。例如,2x3 陣列的形狀為 (2, 3)。

  • 步長 - 步長是在遍歷陣列時每個維度需要跳過的位元組數。步長決定如何在每個維度上從一個元素移動到下一個元素。

行主序和列主序

ndarray 中的元素可以以兩種主要順序儲存。它們是:

  • 行主序(C 樣式) - 在行主序中,最後一個索引變化最快。這意味著同一行中的元素在記憶體中彼此相鄰儲存。NumPy 預設使用行主序。例如,在 2x3 陣列中:

    [[1, 2, 3],
     [4, 5, 6]]
    

    元素在記憶體中儲存為:1、2、3、4、5、6。

  • 列主序(FORTRAN 樣式) - 在列主序中,第一個索引變化最快。這意味著同一列中的元素在記憶體中彼此相鄰儲存。例如,在 2x3 陣列中:

    [[1, 2, 3],
     [4, 5, 6]]
    

    元素在記憶體中儲存為:1、4、2、5、3、6。

示例

以下是一個基本示例,演示了記憶體佈局的使用:

import numpy as np

# Creating a 2x3 array in row-major order
a = np.array([[1, 2, 3], [4, 5, 6]])
print("Array:")
print(a)
print("Shape:", a.shape)
print("Strides:", a.strides)

陣列的形狀為 (2, 3),表示它有 2 行 3 列。步長為 (24, 8),這意味著要移動到下一行,我們需要跳過 24 個位元組(因為每個元素都是一個 8 位元組整數,並且有 3 列),要移動到下一列,我們需要跳過 8 個位元組(一個整數的大小),如以下輸出所示:

Array:
[[1 2 3]
 [4 5 6]]
Shape: (2, 3)
Strides: (24, 8)
廣告