关于numpy数组的轴
这里上结论:numpy的array只有维度(ndim),一个维度就是一条轴(axis),没有秩(rank);numpy的matrix是一个ndim=2的array,有两条轴,而它的秩就是《线性代数》里定义的秩,得另说。
怎么理解多维数组?
比如一维的:[1,2,2],嗯~一条直线;
比如二维的:[[1,2,3],[4,5,6]],嗯~一个平面;
比如三维的:[[[1,2,3],[1,2,3]],[[1,2,3],[1,2,3]]],嗯~一个立方体。但看到这里,我也已经是[黑人问号?].jpg的。
那四维的呢?当然,我很佩服有人能看到四维空间。
人的双眼看到的本质上只是两个2维的平面图像而已。所以孔老夫子才说:唯二次元一目了然(笑)。三维的对我来说就已经很复杂了。
我在想,如何在平面上表示多维数组,直观地看到它的轴。然后想到了完全树。
直接上图吧:
这里再看numpy数组的切片操作,如:arr[:,1,:],这里每一个逗号分割出轴,每一条轴看作一个list去切片就行了,也不用管切到了哪一个平面上,因为切片是可以精确到单个元素的,按着上面的完全树找对应的那一片元素就可以了。
还有一个问题,上边的apply_along_axis(sum,1,arr)返回的是一个shape=(2,3)的数组,即arr的axis=1这条轴不见了。注意这里传入的是sum函数,如果是别的函数,比如: lambda x:2*x,只是把数组中每一个元素都乘以2,并没有降维(把相应的轴抽掉);因为没有降维,所以把这个lambda函数应用到其它轴上,得到的结果也是一样的。
np.swapaxes(0,2),即轴0和轴1交换。比如第一个元素arr[0,0,0],交换后仍是arr[0,0,0];第二个元素arr[0,0,1],交换后则为arr[1,0,0];...;最后一个元素arr[1,1,2],交换后为arr[2,1,1]。