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資料型別的特點歸納為以下幾點,

  1. 只能儲存相同型別的元素
  2. 每個維度上的資料數量必須一樣,比如2維ndarray中各個列上的資料個數必須一樣,當然各行也必須具有同樣數量的資料
  3. 基於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