shape.形状
创建一个数组
np.arange(10).reshape((5,2))
Out:
array([[0, 1],
[2, 3],
[4, 5],
[6, 7],
[8, 9]])
reshape(5,2)
可以理解为一个二维数组,这个二维数组中有5个长度为2的一维数组,5是一维数组的个数,2是一维数组的长度,假如reshape为(2,5)则表示一个二维数组里面有2个长度为5的一维数组:[[0,1,2,3,4],[5,6,7,8,9]]
。
下面一个4维数组:
np.arange(16).reshape((2,2,2,2))
Out:
array([[[[ 0, 1],
[ 2, 3]],
[[ 4, 5],
[ 6, 7]]],
[[[ 8, 9],
[10, 11]],
[[12, 13],
[14, 15]]]])
shape为(2,2,2,2) tuple的长度是数组的维度,这里是长度4是4维,这个数组可以理解为
当shape=(2,2,2,2)时,表示这是个四维数组,其中三维数组的个数=2,二维数组的个数=2x2,一维数组的个数=2x2x2,size=2x2x2x2
一个ndarray数组的shape就是这个数组的形状
axis.轴
理解了shape,axis就很容易了
拿上面的4维数组来举例
四维数组求和
t = np.arange(16).reshape(2,2,2,2)
np.sum(t, axis=0)
array([[[ 8, 10],
[12, 14]],
[[16, 18],
[20, 22]]])
np.sum(t, axis=1)
array([[[ 4, 6],
[ 8, 10]],
[[20, 22],
[24, 26]]])
np.sum(t, axis=2)
array([[[ 2, 4],
[10, 12]],
[[18, 20],
[26, 28]]])
np.sum(t, axis=3)
array([[[ 1, 5],
[ 9, 13]],
[[17, 21],
[25, 29]]])
当axis=0
,从也就是shape中的第一个2
,从上面的图中浅蓝色部分可以看出,这个2表示的是2个三维数组t[0]和t[1]
t[0]
array([[[0, 1],
[2, 3]],
[[4, 5],
[6, 7]]])
t[1]
array([[[ 8, 9],
[10, 11]],
[[12, 13],
[14, 15]]])
所以np.sum(t, axis=0)
等价于t[0,:,:,:]+t[1,:,:,:]
axis=1
表示shape中的第二个轴,等价于t[:,0,:,:]+t[:,1,:,:]
axis=2
表示shape中的第三个轴,等价于t[:,:,0,:]+t[:,:,1,:]
axis=3
表示shape中的第四个轴,等价于t[:,:,:,0]+t[:,:,:,1]
轴与切片索引位置是一一对应的
冒号在不产生歧义的情况下可以省略,比如上面第一行可简写为t[0]+t[1]
二维数组求和
t=np.arange(10).reshape(5,2)
array([[0, 1],
[2, 3],
[4, 5],
[6, 7],
[8, 9]])
np.sum(t,axis=0)
array([20, 25])
np.sum(t,axis=1)
array([ 1, 5, 9, 13, 17])
np.sum(t, axis=0)
表示沿第一个轴求和,等同于
t[0]+t[1]+t[2]+t[3]+t[4]
np.sum(t, axis=1)
表示沿第二个轴求和,等同于
t[:,0]+t[:,1]
数组相乘
假设有以下数组,现在把第一行x10,第二行x5,第三行x1
t = np.arange(12).reshape(3,4)
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
直接用t*[10,5,1]
会报错,因为t是二维数组,[10,5,1]
则是一维数组,维数不同无法相乘,应该转换一下维度,t*np.array([10,5,1]).reshape(3,1)
,等同于t*[[10],[5],[1]]
,等同于t[0]*10,t[1]*5,t[2]*1
t = np.arange(16).reshape(2,2,-1,2)
# 把t拉伸成一维数组
t.reshape(-1)
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
reshape()
中的一个维度可以用-1
省略,前提是-1
位置的值是唯一的,比如上面第一行,-1
位置的值等于16/2/2/2=2
,假如改写成2,-1,2,-1
会报错, 因为-1
位置的值不再是唯一的,可以是2,1,2,4
,2,4,2,1