數組

編輯

NumPy數組類似於Python列表。它們都可以用作容器,具有獲取(getting)和設置(setting)元素以及插入和移除元素的功能。Python列表用樹實現。Numpy數組用C語言數組實現,更緊湊,尤其是在一維以上的維度;向量化操作時比Python列表快,但在末尾添加元素比Python列表慢。

用法

編輯

NumPy數組類似於Python列表用法略有區別:

a=[1,2,3]
b=[4,5,6]
[q*2 for q in a]
[q+r for q,r in zip(a,b)]

a=np.array([1,2,3])
b=np.array([4,5,6])
a*2
a+b

數組生成

編輯

NumPy數組無法像Python列表那樣加長,因為在數組末尾沒有保留空間。因此,常見的做法是定義一個Python列表,對它進行操作,然後再轉換為NumPy數組,或者用np.zeros和np.empty初始化數組,預分配必要的空間。

a=np.array([1,2,3])
b=np.zeros(3,int)
c=np.ones(3,int)
d=np.empty(3)
e=np.full(3,7)
f=np.zeros_like(a)
g=np.ones_like(a)
h=np.empty_like(a)

i=np.arange(2,9,2) #Out: array([2, 4, 6, 8]);  arange means Array Range
np.linspace(2.0, 3.0, num=5)# output:  array([2.  , 2.25, 2.5 , 2.75, 3.  ])

np.random.randint(0,10,3) # uniform in [0,10). Caution: random.randint is in [0,10]
np.random.uniform(1, 10,3)
np.random.randn(3) # standard normal distribution
np.random.normal(5,2,3) #normal, mu=5, sigma=2

數組訪問

編輯

數組的索引基於0.

索引為-1的元素為數組首元素的左側元素,即數組尾元素。因此,a[-2:]即數組的尾部兩個元素。

索引範圍可用 begin:end 形式或者 begin:end:step形式,其中的begin、end都可以省略採用缺省值

索引也可以表示為一個list,如a1,3,4表示取數組a的第2、4、5號元素。

數組的賦值,如b=a, c=a[:]都是原數組的view,只有 d=a.copy()才是複製一份。

也可以用布爾索引。例如 a[a>5]

np.ndenumerate類構造了數組的迭代器。每次迭代返回索引與值的組合。

獲取滿足條件的數組元素的索引,可用用np.where()函數或等效的np.nonzero()函數。為了獲取滿足條件的多維數組元素的索引,可用np.transpose(np.nonzero(x>1))或等效的np.where(x>1)

np.where()函數的更高級用法,使用三個參數condition、x、y,表示如果條件滿足,就取array_like的x的對應元素替換,否則取y的對應元素替換。

np.clip()函數對一個數組給定一個interval如[a,b],數組中值小於a的元素被賦值為a,值大於b的元素被賦值為b。

數組的運算

編輯

數組可以與純量運算,也可以與另一個數組運算。

和Python中一樣,a//b表示div b(整除),x**n表示xⁿ

向量的點積可以用np.dot()函數,也可以用運算符@, 如 a@b

向量的叉積可以用np.cross()函數

數組的成員函數可以做的運算:max、min、argmax、argmin、sum、var、mean、std、sort(原地排序)、

np.searchsorted()函數對已排序數組搜索一個值的第一次出現的索引。

浮點數比較,使用np.allclose()函數。可以指定相對公差參數rtol或絕對公差參數atol。

多維數組

編輯

與一維數組相比,多維數組的新概念如下。

eyes()用於生成單位陣。

NumPy引入了axis的概念。對第i個軸,如x.sum(axis=1),表示保持其他索引,對第i個索引的遍歷求累計值。

多維數組的運算符,除了@是矩陣乘法,其他均為element-wise。二維操作運算中,行向量和列向量被不同地對待。默認情況下,一維數組在二維操作中被視為行向量。因此,行向量的shape,是(n,)即(1,n)。

矩陣的轉置,如x.T

一維數組生成二位數組可以使用reshape函數或newaxis建立新索引,都是原數組的view。例如a是一維數組,a.reshape(-1,1)等效於a[:,None],相當於行向量變為列向量。其中-1表示reshape自動計算該維度上的長度;方括號中的None充當np.newaxis的快捷方式,即在指定位置添加了一個空axis。

因此,NumPy中總共有三種類型的向量:一維數組,二維行向量和二維列向量。後二者轉化為一維數組,可以用成員函數flatten()或reshape(-1)。根據規則,一維數組被隱式解釋為二維行向量,因此通常不必在這兩個數組之間進行轉換,但一維數組的轉置T操作結果還是原數組。

矩陣的堆疊或叫做連接,使用np.hstack與np.vstack()。矩陣與一維數字的水平堆疊,也可以用np.column_stack()。np.append()也可以對行或列追加。堆疊的逆操作是分裂:np.hsplit()與np.vsplit

矩陣可以通過兩種方式完成複製:tile類似於分塊矩陣的複製粘貼,repeat類似於逐行或逐列的複製。

特定的列和行可以用np.delete()刪除。逆運算為np.insert()函數