NumPy快餐教程(1) – 如何生成多維陣列

阿里云云棲社群發表於2019-02-16

摘要: 在演算法中我們最經常用到的就是矩陣,我們就從矩陣開始說起吧。 NumPy中,使用二維的多維陣列ndarray來儲存矩陣。
Python現在是最熱門的人工智慧語言,各種工具的支援如Google的Tensorflow,都是首選支援Python的。
但是,與R語言不同,Python語言設計時,並沒有考慮對於矩陣運算,統計計算等功能做專項支援。於是我們需要NumPy庫來補足這一能力上的不足。

NumPy是Python的著名擴充套件庫,相當於Python中的MATLAB。

如何生成多維陣列

初識ndarray多維陣列

在演算法中我們最經常用到的就是矩陣,我們就從矩陣開始說起吧。
NumPy中,使用二維的多維陣列ndarray來儲存矩陣。

例:

a3 = np.array([[1,0],[0,1]])

會生成這樣一個多維陣列物件

array([[1, 0],
       [0, 1]])

生成陣列序列

通過開始值、結束值和步長值生成陣列序列 – arange
可以通過arange函式來生成指定開始值,結束值和步長值的一維陣列。請注意,結束值並不包含在序列中,也就是說結束值是開區間。

In [25]: a4 = np.arange(1,10,1)

In [26]: a4
Out[26]: array([1, 2, 3, 4, 5, 6, 7, 8, 9])
線性序列 - linspace

與arange類似,linspace通過給定初值、終值和元素個數來生成序列。是否包含終值可以通過endpoint屬性來設定。

例:

In [37]: a8 = np.linspace(1,10,10,endpoint=True)

In [38]: a8
Out[38]: array([  1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,  10.])

等比序列 – logspace

除了線性的等差數列,我們也可以通過等比數列的方式來生成一維陣列。
預設是以10的n次方為引數,比如logspace(0,4,3)的意思是,初值為10的0次方,即1,終值是10的4次方,即100,一共生成3個值。

例,生成[1,100,10000]

In [47]: a9 = np.logspace(0,4,3)

In [48]: a9
Out[48]: array([  1.00000000e+00,   1.00000000e+02,   1.00000000e+04])

我們當然也可以修改基數,比如改成3:

In [53]: a10 = np.logspace(1,5,3,base=3)

In [54]: a10
Out[54]: array([   3.,   27.,  243.])

改變多維陣列的形狀

如果有一個一維陣列要轉為多維陣列,可以通過修改shape屬性來實現。

我們可以先將資料存在一維陣列中,可以用列表或者元組來生成一維陣列,它們是等價的:
例:

In [2]: a1 = np.array([1,2,3,4])

In [3]: a1
Out[3]: array([1, 2, 3, 4])

In [4]: a2 = np.array((1,0,0,1))

In [5]: a2
Out[5]: array([1, 0, 0, 1])

我們通過shape屬性來檢視一個陣列的形狀:

In [14]: a1.shape
Out[14]: (4,)

In [15]: a2.shape
Out[15]: (4,)

shape屬性是可以直接修改的,比如我們想把上面的a1改成2 x 2的矩陣,就直接改shape值就是了:

In [16]: a1.shape = 2,2

In [17]: a1
Out[17]: 
array([[1, 2],
       [3, 4]])

如果能確定一個軸,另一個可以賦-1讓系統自己去算。
例:

In [18]: a2.shape= 2,-1

In [19]: a2
Out[19]: 
array([[1, 0],
       [0, 1]])

如果想保持這個陣列不變,生成一個形狀改變的新陣列,可以呼叫reshape方法。
例:我們將一個25個元素的陣列生成一個5×5的新陣列

In [59]: a11 = np.linspace(1,100,25)

In [60]: a11
Out[60]: 
array([   1.   ,    5.125,    9.25 ,   13.375,   17.5  ,   21.625,
         25.75 ,   29.875,   34.   ,   38.125,   42.25 ,   46.375,
         50.5  ,   54.625,   58.75 ,   62.875,   67.   ,   71.125,
         75.25 ,   79.375,   83.5  ,   87.625,   91.75 ,   95.875,  100.   ])

In [61]: a12 = a11.reshape(5,-1)

In [62]: a12
Out[62]: 
array([[   1.   ,    5.125,    9.25 ,   13.375,   17.5  ],
       [  21.625,   25.75 ,   29.875,   34.   ,   38.125],
       [  42.25 ,   46.375,   50.5  ,   54.625,   58.75 ],
       [  62.875,   67.   ,   71.125,   75.25 ,   79.375],
       [  83.5  ,   87.625,   91.75 ,   95.875,  100.   ]])

直接生成多維陣列

生成全0的陣列
zeros生成全是0的陣列,第一個引數是shape

例:

In [65]: np.zeros((10,10))
Out[65]: 
array([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]])

生成全是1的陣列
例:

In [66]: np.ones((5,5))
Out[66]: 
array([[ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.]])
只生成空陣列

empty不賦初值,是最快速的方法

例:

In [67]: np.empty((3,3))
Out[67]: 
array([[  1.   ,   2.125,   3.25 ],
       [  4.375,   5.5  ,   6.625],
       [  7.75 ,   8.875,  10.   ]])

通過函式來生成陣列

通過fromfunction函式可以通過一個函式來生成想要的陣列。

例,生成九九乘法表:

In [125]: def mul2(x,y):
     ...:     return (x+1)*(y+1)
     ...: 

In [126]: np.fromfunction(mul2,(9,9))
Out[126]: 
array([[  1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.],
       [  2.,   4.,   6.,   8.,  10.,  12.,  14.,  16.,  18.],
       [  3.,   6.,   9.,  12.,  15.,  18.,  21.,  24.,  27.],
       [  4.,   8.,  12.,  16.,  20.,  24.,  28.,  32.,  36.],
       [  5.,  10.,  15.,  20.,  25.,  30.,  35.,  40.,  45.],
       [  6.,  12.,  18.,  24.,  30.,  36.,  42.,  48.,  54.],
       [  7.,  14.,  21.,  28.,  35.,  42.,  49.,  56.,  63.],
       [  8.,  16.,  24.,  32.,  40.,  48.,  56.,  64.,  72.],
       [  9.,  18.,  27.,  36.,  45.,  54.,  63.,  72.,  81.]])
       

本文作者:lusing

閱讀原文

本文為雲棲社群原創內容,未經允許不得轉載。

相關文章