python3 Numpy 基礎 (三)
阿新 • • 發佈:2018-12-25
形狀改變
- 可以使用各種命令更改陣列的形狀。請注意,以下三個命令都返回已修改的陣列,但不更改原始陣列。
In [109]: a = np.floor(10*np.random.random((3,4)))
In [110]: a
Out[110]:
array([[5., 5., 8., 7.],
[5., 0., 9., 0.],
[7., 4., 6., 5.]])
In [111]: a.ravel()
Out[111]: array([5., 5., 8., 7., 5., 0., 9., 0., 7., 4., 6., 5.])
In [112]: a.reshape(6 ,2)
Out[112]:
array([[5., 5.],
[8., 7.],
[5., 0.],
[9., 0.],
[7., 4.],
[6., 5.]])
In [113]: a.T
Out[113]:
array([[5., 5., 7.],
[5., 0., 4.],
[8., 9., 6.],
[7., 0., 5.]])
In [114]: a.T.shape
Out[114]: (4, 3)
In [115]: a.shape
Out[115]: (3, 4)
- 幾個陣列可以沿不同的軸堆疊在一起:,
In [119]: a = np.array([1,2,3])
In [120]: a
Out[120]: array([1, 2, 3])
In [121]: b = np.array([4,5,6])
In [122]: b
Out[122]: array([4, 5, 6])
In [123]: np.vstack((a,b))
Out[123]:
array([[1, 2, 3],
[4, 5, 6]])
In [124]: np.hstack((a,b))
Out[124]: array([1, 2, 3, 4, 5, 6])
- 使用時hsplit,可以沿著水平軸分割陣列,方法是指定要返回的形狀相同的陣列的數量,或者指定應該進行除法的列:
In [125]: a = np.floor(10*np.random.random((2,12)))
In [126]: a
Out[126]:
array([[9., 8., 4., 4., 6., 7., 5., 0., 2., 2., 7., 4.],
[5., 6., 4., 5., 4., 3., 9., 8., 1., 3., 9., 8.]])
In [127]: np.hsplit(a,3)
Out[127]:
[array([[9., 8., 4., 4.],
[5., 6., 4., 5.]]), array([[6., 7., 5., 0.],
[4., 3., 9., 8.]]), array([[2., 2., 7., 4.],
[1., 3., 9., 8.]])]
In [128]: np.hsplit(a,(3,4))
Out[128]:
[array([[9., 8., 4.],
[5., 6., 4.]]), array([[4.],
[5.]]), array([[6., 7., 5., 0., 2., 2., 7., 4.],
[4., 3., 9., 8., 1., 3., 9., 8.]])]
副本和檢視
- 簡單分配不會複製陣列物件或其資料。
In [138]: a = np.arange(6)
In [139]: b = a
In [140]: b is a
Out[140]: True
In [141]: b.shape = 2,3
In [142]: a.shape
Out[142]: (2, 3)
- Python將可變物件作為引用傳遞,因此函式呼叫不會複製。
In [146]: def f(x):
...: print(id(x))
...:
In [147]: a = np.arange(6)
In [148]: id(a)
Out[148]: 140069411015376
In [149]: f(a)
140069411015376
- 不同的陣列物件可以共享相同的資料。該view方法建立一個檢視相同資料的新陣列物件。
In [150]: c = a.view()
In [151]: c is a
Out[151]: False
In [152]: c.flags.owndata
Out[152]: False
In [153]: c.shape = 2,3
In [154]: a.shape
Out[154]: (6,)
- copy方法生成陣列及其資料的完整副本。
In [171]: a = np.arange(6)
In [172]: d = a.copy()
In [173]: d is a
Out[173]: False
In [174]: d.base is a
Out[174]: False
In [175]: d[0] = 123
In [176]: a
Out[176]: array([0, 1, 2, 3, 4, 5])