NumPy 多維陣列-ndarray
NumPy 是將多維陣列作為基本資料結構來進行操作的庫。NumPy 中的唯一資料結構是 ndarray,而不是 Python 原生的列表,因為列表的操作速度很慢。
學習 NumPy 時,瞭解 ndarray 後可以更加清楚的知道為什麼 NumPy 能夠實現高速的運算,它是 NumPy 的重中之重。
ndarray 定義
ndarray
是 n-dimension array 的縮寫,也就是多維陣列的意思,我們可以通過它的官網得到它的具體定義-一個 ndarray
是一個具有相同資料型別和形狀的(通常固定形狀)多維容器。維數和元素個數是通過形狀(shape)來定義的,其中 shape
是一個有 N 個整數的元組,它代表了每個維度上元素的多少。在陣列中的元素型別是通過 dtype
-data-type object
來定義的。
我們來用通俗的語言把上面的話解釋一遍就是 ndarray
儲存在物件例項中的所有元素必須具有相同型別的資料型別以及尺寸。
ndarray
資料型別的特點歸納為以下幾點,
- 只能儲存相同型別的元素
- 每個維度上的資料數量必須一樣,比如 2 維
ndarray
中各個列上的資料個數必須一樣,當然各行也必須具有同樣數量的資料 - 基於 C 語言,所以能最優化的執行矩陣運算
ndarray 屬性
我們先列出 ndarray
的屬性來,
屬性 | 說明 |
---|---|
T |
轉置矩陣。當陣列為 1 維時,返回原始陣列 |
data |
一個 Python 緩衝區物件,指向陣列中資料的起始位置 |
dtype |
ndarray 中包含的元素的資料型別 |
flags |
有關如何在記憶體中儲存 ndarray 資料的資訊(記憶體佈局) |
flat |
將 ndarray 轉換為一維陣列的迭代器 |
imag |
ndarray 資料中的虛部 |
real |
ndarray 資料中的實部 |
size |
ndarray 中包含的元素數量 |
itemsize |
每個元素的大小(以位元組為單位) |
nbytes |
該 ndarray 佔用的總記憶體(以位元組為單位) |
ndim |
ndarray 中包含的維數 |
shape |
ndarray 的形狀(結果為元組) |
strides |
移動到每個維度方向上的下一個相鄰元素所需的位元組數由元組表示 |
ctypes |
在 ctypes 模組中處理的迭代器 |
base |
ndarray 所基於的物件(正在引用哪個記憶體) |
當你訪問 ndarray
裡面的屬性時,ndarray
的內容是不會變的,假如當你用 .T
來得到它的轉置時,原始資料其實並沒有改變,你得到的是一個全新的 ndarray
。
我們通過程式碼來看一下每個屬性它具體的意義,
>>> import numpy as np
>>> a = np.array([1, 2, 3])
我們需要呼叫 NumPy
庫,然後新建一個一維陣列。我們來看一下它的資料型別及元素的資料型別
>>> type(a)
numpy.ndarray
>>> a.dtype
dtype('int32')
我們再來新建一個二維陣列,並看一下它的一些屬性,
>>> b = np.array([[4, 5, 6], [7, 8, 9]])
>>> b
array([[4, 5, 6],
[7, 8, 9]])
>>> b.T # 求 b 的轉置矩陣
array([[4, 7],
[5, 8],
[6, 9]])
>>> b # 可以通過以下看出來,b 的資料和資訊是沒有變化的
array([[4, 5, 6],
[7, 8, 9]])
>>> a.size # a 裡面有三個元素
3
>>> b.size # b 裡面有 6 個元素
6
>>> a.itemsize # a 元素資料裡有幾個位元組長度,這裡是 8 位元組,因為資料型別是 int64
8
>>> b.nbytes # b 陣列一共有多少個位元組,這裡是 48,6x8
48
>>> b.shape # b 的形狀,2 行 3 列
(2, 3)
>>> b.dnim # b 的維數,二維
2
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn