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,42,4,2,1

参考:https://zhuanlan.zhihu.com/p/30960190