文章目錄
- 1. 更改數組的形狀
- 2. 將不同數組堆疊在一起
- 3. 將一個數組分成幾個較小的數組
1. 更改數組的形狀
>>> import numpy as np
>>> a = np.floor(10*np.random.random((3,4)))
>>> a
array([[2., 2., 5., 6.],[2., 7., 4., 2.],[9., 3., 5., 8.]])
>>> a.shape
(3, 4)
數組的形狀可通過各種命令更改。請注意,以下三個命令都返回修改后新的數組,原始數組不變:
ravel()、reshape(m,n)、T
>>> a.ravel() # ravel拆開的意思,展平數組
array([2., 2., 5., 6., 2., 7., 4., 2., 9., 3., 5., 8.])
>>> a.reshape(6,2) #返回新的修改行數列數后的數組
array([[2., 2.],[5., 6.],[2., 7.],[4., 2.],[9., 3.],[5., 8.]])
>>> a.T #行列互換,轉置
array([[2., 2., 9.],[2., 7., 3.],[5., 4., 5.],[6., 2., 8.]])
>>> a.T.shape
(4, 3)
>>> a.shape
(3, 4)
下面這段話不明白:
由ravel()產生的數組中元素的順序通常是“C風格”,也就是說,最右邊的索引“改變最快”,所以[0,0]之后的元素是[0,1] 。如果數組被重新塑造成其他形狀,數組又被視為“C-style”。NumPy通常創建按此順序存儲的數組,因此ravel()通常不需要復制其參數,但如果數組是通過切片另一個數組或使用不尋常選項創建的,則可能需要復制它。函數ravel()和reshape()也可以通過使用可選參數來指示使用FORTRAN風格的數組,其中最左側的索引更改速度最快。
- reshape(m,n) 函數返回具有修改形狀的參數,而 ndarray.resize((m,n)) 方法修改原始數組
>>> a
array([[2., 2., 5., 6.],[2., 7., 4., 2.],[9., 3., 5., 8.]])>>> a.resize((2,6))
>>> a
array([[2., 2., 5., 6., 2., 7.],[4., 2., 9., 3., 5., 8.]])
- 如果在reshape(m,n)操作中將維度指定為-1,則會自動計算該維度
>>> a.reshape(3,-1) #不想算的維度設置成-1,偷懶
array([[2., 2., 5., 6.],[2., 7., 4., 2.],[9., 3., 5., 8.]])
>>> a.reshape(-1,3)
array([[2., 2., 5.],[6., 2., 7.],[4., 2., 9.],[3., 5., 8.]])
2. 將不同數組堆疊在一起
>>> a = np.floor(10*np.random.random((2,2)))
>>> a
array([[5., 7.],[6., 0.]])>>> b = np.floor(10*np.random.random((2,2)))
>>> b
array([[1., 5.],[1., 5.]])>>> np.vstack((a,b)) # v 垂向疊加
array([[5., 7.],[6., 0.],[1., 5.],[1., 5.]])>>> np.hstack((b,a)) # h 水平疊加
array([[1., 5., 5., 7.],[1., 5., 6., 0.]])
- 函數 column_stack 將1D數組作為列疊加到2D數組中。它相當于僅用于二維數組的 hstack
>>> from numpy import newaxis
>>> np.column_stack((a,b))
array([[5., 7., 1., 5.],[6., 0., 1., 5.]])>>> a = np.array([4,2])
>>> b = np.array([3,9])>>> np.column_stack((a,b))
array([[4, 3], # a、b 作為 列 向量[2, 9]])>>> np.hstack((a,b))
array([4, 2, 3, 9])>>> a[:,newaxis] # 加入新的軸
array([[4],[2]])>>> np.column_stack((a[:,newaxis],b[:,newaxis]))
array([[4, 3],[2, 9]])
>>> np.hstack((a[:,newaxis],b[:,newaxis])) #兩者結果一樣
array([[4, 3],[2, 9]])
- 函數 row_stack 相當于 vstack。一般來說,對于具有兩個以上維度的數組,hstack 沿第二軸堆疊,vstack 沿第一軸堆疊,concatenate 允許一個可選參數,給出串接應該發生的軸。
在復雜情況下,r_ 和 c_ 可用于通過沿一個軸疊加數字來創建數組。它們允許使用范圍字面量(“:”)
>>> np.r_[1:5,8,9]
array([1, 2, 3, 4, 8, 9])>>> np.c_[1:3,[8,9], [10,11]]
array([[ 1, 8, 10],[ 2, 9, 11]])
3. 將一個數組分成幾個較小的數組
- 使用 hsplit ,可沿水平軸拆分,通過指定要返回的均勻劃分的數組數量,或指定要在其后進行劃分的列
>>> a = np.floor(10*np.random.random((2,12)))
>>> a
array([[8., 9., 8., 8., 9., 9., 3., 6., 2., 3., 3., 1.],[2., 5., 8., 5., 9., 2., 1., 3., 6., 1., 6., 8.]])
>>> np.hsplit(a,3) # 將 a 分成3份
[array([[8., 9., 8., 8.],[2., 5., 8., 5.]]), array([[9., 9., 3., 6.],[9., 2., 1., 3.]]), array([[2., 3., 3., 1.],[6., 1., 6., 8.]])]
>>> np.hsplit(a,(3,4))
[array([[8., 9., 8.],[2., 5., 8.]]), array([[8.],[5.]]), array([[9., 9., 3., 6., 2., 3., 3., 1.],[9., 2., 1., 3., 6., 1., 6., 8.]])]
>>> np.hsplit(a,(3,5)) # 把3,4列劃出來
[array([[8., 9., 8.],[2., 5., 8.]]), array([[8., 9.],[5., 9.]]), array([[9., 3., 6., 2., 3., 3., 1.],[2., 1., 3., 6., 1., 6., 8.]])]
- vsplit 沿縱軸分割,并且 array_split 允許指定沿哪個軸分割。
>>> a
array([[8., 9., 8., 8., 9., 9.],[3., 6., 2., 3., 3., 1.],[2., 5., 8., 5., 9., 2.],[1., 3., 6., 1., 6., 8.]])
>>> np.vsplit(a,(2,4)) # 把2,3行劃出來
[array([[8., 9., 8., 8., 9., 9.],[3., 6., 2., 3., 3., 1.]]), array([[2., 5., 8., 5., 9., 2.],[1., 3., 6., 1., 6., 8.]]), array([], shape=(0, 6), dtype=float64)]
>>> np.vsplit(a,(2,3)) # 把2行劃出來
[array([[8., 9., 8., 8., 9., 9.],[3., 6., 2., 3., 3., 1.]]), array([[2., 5., 8., 5., 9., 2.]]), array([[1., 3., 6., 1., 6., 8.]])]
總結
以上是生活随笔為你收集整理的NumPy快速入门--形状操作的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。