NumPy 系列(四):numpy 数组的变形
4.1 数组的转置
数组的转置方法为 .T,其只对矩阵有效,因此遇到向量要先将其转化为矩阵。
(1)向量的转置
import numpy as np
arr1=np.arange(12)
print(arr1)
arr2=np.arange(1,4)
print(arr2)
arr3=np.arange(2,12)
print(arr3)
[ 0 1 2 3 4 5 6 7 8 9 10 11]
[1 2 3]
[ 2 3 4 5 6 7 8 9 10 11]
arr4=arr1.reshape(1,-1) # 升级为矩阵
print(arr4)
arr5=arr2.reshape((1,-1)) # 自适应
print(arr5)
arr6=arr3.reshape(1,-1).T # 矩阵转置
print(arr6)
arr7=arr3.reshape(-1,1) # 另外一种转置
print(arr7)
[[ 0 1 2 3 4 5 6 7 8 9 10 11]]
[[1 2 3]]
[[ 2][ 3][ 4][ 5][ 6][ 7][ 8][ 9][10][11]]
[[ 2][ 3][ 4][ 5][ 6][ 7][ 8][ 9][10][11]]
(2)矩阵的转置
行矩阵的转置刚演示了,列矩阵的转置如示例所示。
import numpy as np
arr1=np.arange(4).reshape(-1,1)
arr2=arr1.T
print(arr1,'\n\n',arr2)
[[0][1][2][3]] [[0 1 2 3]]
arr3=np.arange(6).reshape(2,3)
arr4=arr3.T
print(arr3,"\n\n",arr4)
[[0 1 2][3 4 5]] [[0 3][1 4][2 5]]
4.2 数组的翻转
数组的翻转方法有两个,一个是上下翻转的 np.flipud( ) ,表示 up-down;
一个是左右翻转的 np.fliplr( ),表示 left-right。其中,向量只能使用 np.flipud( ),
在数学中,向量并不是横着排的,而是竖着排的。
(1)向量的翻转
import numpy as np
arr1=np.arange(10)
arr2=np.flipud(arr1)
print(arr1,"\n\n",arr2)
[0 1 2 3 4 5 6 7 8 9] [9 8 7 6 5 4 3 2 1 0]
(2)矩阵的翻转
import numpy as np
arr1=np.arange(20).reshape(4,5)
arr1_ud=np.flipud(arr1)
arr1_lr=np.fliplr(arr1)
print(arr1,"\n\n",arr1_ud)
print("\n\n",arr1,"\n\n",arr1_lr)
[[ 0 1 2 3 4][ 5 6 7 8 9][10 11 12 13 14][15 16 17 18 19]] [[15 16 17 18 19][10 11 12 13 14][ 5 6 7 8 9][ 0 1 2 3 4]][[ 0 1 2 3 4][ 5 6 7 8 9][10 11 12 13 14][15 16 17 18 19]] [[ 4 3 2 1 0][ 9 8 7 6 5][14 13 12 11 10][19 18 17 16 15]]
4.3 数组的重塑
想要重塑数组的形状,需要用到 .reshape( ) 方法。
前面说过,给定了其他维度的数值,剩下一个维度可以填-1,让它自己去计
算。比如把一个 5 行 6 列的矩阵重塑为 3 行 10 列的矩阵,当列的参数 10 告诉
它,行的参数直接可以用-1 来替代,它会自己去用 30 除以 10 来计算。
(1)向量的变形
import numpy as np
arr1=np.arange(10)
print(arr1)
[0 1 2 3 4 5 6 7 8 9]
arr2=arr1.reshape(2,5)
print(arr2)
[[0 1 2 3 4][5 6 7 8 9]]
(2)矩阵的变形
import numpy as np
arr1=np.array([[2,34,5],[6,76,12]])
arr2=arr1.reshape(3,2) # 变形为矩阵
arr3=arr1.reshape(-1) # 变形为向量
print(arr2)
print(arr3)
[[ 2 34][ 5 6][76 12]]
[ 2 34 5 6 76 12]
4.4 数组的拼接
(1)向量的拼接
两个向量拼接,将得到一个新的加长版向量。
import numpy as np
arr1=np.arange(10)
arr2=np.array([1,2,46,787])
arr3=np.concatenate([arr1,arr2]) # 注意:要用列表传参
print(arr3)
[ 0 1 2 3 4 5 6 7 8 9 1 2 46 787]
(2)矩阵的拼接
两个矩阵可以按不同的维度进行拼接,但拼接时必须注意维度的吻合。
import numpy as np
arr1=np.array([[4,3,2,1],[11,22,33,44]])
arr2=np.array([[1,2,46,787]])
arr3=np.array([[777],[888]])
arr4=np.concatenate([arr1,arr2],axis=0) # 按照行拼接,此时axis可省略
arr5=np.concatenate([arr1,arr3],axis=1) # 按照列拼接
print(arr4)
print(arr5)
[[ 4 3 2 1][ 11 22 33 44][ 1 2 46 787]]
[[ 4 3 2 1 777][ 11 22 33 44 888]]
最后要说明的是,向量和矩阵不能进行拼接,必须先把向量升级为矩阵。
4.5 数组的分裂
(1)向量的分裂
向量分裂,将得到若干个更短的向量。
import numpy as np
arr=np.arange(10,100,10)
print(arr)
arr1,arr2,arr3=np.split(arr,[2,8])
print(arr1)
print(arr2)
print(arr3)
[10 20 30 40 50 60 70 80 90]
[10 20]
[30 40 50 60 70 80]
[90]
np.split( )函数中,给出的第二个参数[2,8]表示在索引[2]和索引[8]的位置截断。
(2)矩阵的分裂
矩阵的分裂同样可以按不同的维度进行,分裂出来的均为矩阵。
import numpy as np
arr=np.arange(1,9).reshape(2,4)
print(arr)
[[1 2 3 4][5 6 7 8]]
arr1,arr2=np.split(arr,[1]) # 默认axis=0,按行分割
print(arr1,'\n\n',arr2) # 输出的是!!矩阵!!
[[1 2 3 4]] [[5 6 7 8]]
arr3,arr4,arr5=np.split(arr,[1,3],axis=1) # 按列分割
print(arr3,'\n\n',arr4,'\n\n',arr5)
[[1][5]] [[2 3][6 7]] [[4][8]]