1. 程式人生 > >python3 Numpy 基礎 (三)

python3 Numpy 基礎 (三)

形狀改變

  • 可以使用各種命令更改陣列的形狀。請注意,以下三個命令都返回已修改的陣列,但不更改原始陣列。
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])