一個數組的形狀是由每個軸的元素數量決定的,可以通過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()
參考文檔: