numpy 學習:數組改變形狀、副本和view


一個數組的形狀是由每個軸的元素數量決定的,可以通過reshape()和resize()函數來操縱數組的形狀。transpose()函數用於數組的轉置,ravel()函數用於把數組展開為一維數組,而flatten()用於獲得數組展開之后的一個副本;swapaxes()函數用於交換數組的兩個軸,squeeze()函數用於刪除數組中長度為1的軸。

一,數組的變形

數組的轉置可以通過數組的屬性T來獲得,數組的展開可以通過數組的屬性flat來獲得,但是flat是一個迭代器。

1,通過修改shape屬性來改變數組的形狀

numpy.ndarray.shape表示數組的維度,返回一個元組,這個元組的長度就是維度的數目,即 ndim 屬性(秩)。

x = np.array([1, 2, 9, 4, 5, 6, 7, 8])
print(x.shape)  # (8,)
x.shape = [2, 4]

2,reshape函數

reshape()函數返回一個給定shape的數組的副本,不會修改原始數組,並且新的數組的size必須跟原始的數組size相兼容:

numpy.reshape(a, newshape, order='C')

參數 newshape 表示數組的形狀,對於二維數組,newshape是 (row, col) ,第一個維度是行數,第二個維度是列數。

例如,下面的代碼把一個一維數組轉換為4行2列的二位數組:

a=np.arange(8)
a.reshape((4,2))

3,resize函數

resize()函數會修改原始數組,不會返回任何數據,直接對原始數組進行修改:

ndarray.resize(new_shape, refcheck=True)

參數new_shape是元組或n個int數字,表示數組的形狀,即各個維度的元素數量,如果參數new_shape指定的size大於現有數組的size,那么新數組會增加新的元素,新增加的元素值都是0

>>> a.resize((2,6))
>>> a array([[ 2., 8., 0., 6., 4., 5.], [ 1., 1., 8., 9., 3., 6.]])

4,展開數組

numpy.ndarray.flat 將數組轉換為一維的迭代器,可以用for訪問數組每一個元素.

y = x.flat
for i in y:
    print(i, end=' ')

numpy.ndarray.flatten() 將數組的副本轉換為一維數組,並返回原數組的一個copy。

numpy.ndarray.ravel() 用於返回數組的展開形式,在展開成一維數組時,最右邊的索引“變化最快”,返回原始數組的一個view。

ndarray.ravel()
ndarray.flatten()

舉個例子,從行維度和列維度的最小值開始,依次增加,獲取的元素依次排列,構成一維數組:

>>> x = np.array([[1, 2, 3], [4, 5, 6]])
>>> np.ravel(x) array([1, 2, 3, 4, 5, 6])

5,轉置

數組的轉置(Transpose)通過ndarray的屬性T來獲取:

>>> x = np.array([[1.,2.],[3.,4.]])
>>> x
array([[ 1.,  2.],
       [ 3.,  4.]])
>>> x.T
array([[ 1.,  3.],
       [ 2.,  4.]])

變換數組的維度,對於二維數組,轉置是把行坐標和列坐標互換:

numpy.transpose(a, axes=None)

對於多維數組,轉置需要指定新轉換的維度,比如,對於三維數組,用0、1、2表示各個維度,(1,0,2)表示:把列維度變換為行維度,把行維度變化為列維度,第三維度不變。

>>> x = np.ones((1, 2, 3))
>>> np.transpose(x, (1, 0, 2)).shape
(2, 1, 3)

6,交換軸

把數組的兩個軸相互交換

numpy.swapaxes(a, axis1, axis2)

7,移除長度為1的軸

從數組的shape中刪除值為1的維度。

>>> x = np.array([[[0], [1], [2]]])
>>> x.shape
(1, 3, 1) >>> np.squeeze(x).shape (3,) >>> np.squeeze(x, axis=0).shape (3, 1)

二,數組的轉換

可以把數組轉換為list,也可以修改數組元素的數據類型。

1,轉換為list

ndarray對象的tolist()函數可以把一個數組對象轉化為list列表:

>>> np.arange(12).reshape(3,4).tolist()
[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]

2,修改元素的類型

調用astype()函數會創建一個新的數組,是原始數組的一個深拷貝。

arr.astype(np.int8)

三,數組的副本(copy)和視圖(view)

在做數組運算或數組操作時,返回的結果不是數組的副本就是視圖。

  • 直接賦值:無拷貝,相當於是引用
  • view():建立視圖,淺拷貝,形狀可以不一致,但數據相同,對於賦值和view操作,兩個數組的數據是共享的,即引用同一個對象。
  • copy():深拷貝,完全獨立的對象

數組的視圖意味着數據不會被復制,視圖上的任何修改都會直接反應到原始數組上。

view_arr = arr.view()

numpy.ndarray.copy() 函數創建一個副本。 對副本數據進行修改,不會影響到原始數據,它們物理內存不在同一位置。

deep_copy_arr = arr.copy()

 

 

參考文檔:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM