求索集 第二 - 你们还是对我这个宝宝动手了
果然, 我还是飘了.
一本400页的书, 一气就读到了100页, 看起来一切都很顺利的样子, 有一瞬间我甚至怀疑难道不注意之下, 我加了什么装备, 或者双脚离地了, 所以聪明的智商又占领高地了???
然后今天学到数组转置, 晕头转向之下, 我终于回到了现实, 果然, 你们还是对我这个宝宝动手了. 之前还觉得自己还挺不错的,原来是错觉, 都是错觉呀.
二维数组的转置不难理解,X轴变Y轴,行列变换就是了。但是从二维到三维,问题一下子就难了不少,而且还多了轴的概念。比如:
1 | 已知三维数组: |
人家教材是真讲理, 写个代码, 眨眼间计算机就给算出来了。照理说没错呀,数据分析,可不计算工作都是交给计算机么。 问题是简单的计算原理我得会呀,不然我学什么呢?显然,照着问题和答案研究解题原理是不可能了,咱们按部就班,一个一个问题解决。
前提问题一: 如果说二维数组的轴就是X轴和Y轴, 那么三维数组的轴是什么?
经过百度和我自行研究,我大概研究出一个三维数组的轴的概念:
是的, 三维数组有三个轴。以前我的理解是三维数组是三维空间中的二维数组,就像一本书由很多页纸组成一样,但这样的理解不利于转置计算,我换个说法,三维数组确实是若干张纸,就如上面这个三维数组y,就是由三个二维数组在空间中顺序排列而成。
那么这里的轴的定义就是:
0轴是二维数组之间的联系,如1所在的数组和11所在的数组,就是以0轴为联系排列的
1轴是每个二维数组的两行之间的联系,如果把二维数组看作若干一维数组,也就是数列的组合,那么1轴就是这些数列的联系
2轴则是在每个二维数组的一维数列上的每个元素之间的联系,如123队列中的1和2
所以,三维数组的012号轴其实是从大到小排列的,分别联系起二维数组之间, 二维数组内部的一维数组,以及一维数组内部的元素。
而Numpy包的转置是这个意思:
对于三维数组,nparray.transpose(x,y,z)分别对应了0,1,2三个轴
因此就可以知道,对于任意三维数组nparray,
nparray.transpose(0, 1, 2) 就是当前原数组的顺序,未实现转置
nparray.transpose(1, 0, 2) 就是原数组的01轴进行了转置,2轴未动
nparray.transpose(2, 0, 1) 就是原数组2轴变0轴,0轴变1轴,1轴变2轴
NB, 完全糊涂了有没有? 没关系,做题看看。
1 | y = np.array([[[1, 2, 3], |
y.transpose(1,0,2),意思就是0和1轴发生了转置,而2轴没动。既然2轴没动, 那么数列中元素的顺序就没变,123还是123,21,22,23还是21,22,23. 而0和1转置,那么就是以前的数组间(1,2,3和11,12,13)变成了一个数组内,而原来的数组内1,2,3和4,5,6则分属两个数组,写一写,大概是:
1 | y = np.array([[[1, 2, 3], |
用jupyter跑一下代码,结果是对的。 咱们继续验证:
求y.transpose(2,1,0)。
按照刚才我的推断, 这次是2和0轴交换,1没变,那就是说明原来的行之间关系不变,123下面还是456,但表之间的联系变成了原来的数列元素,也就是原来在同一二维数组的同一数列的1,2,3,现在要分别属于不同的数组了, 我们写一写:
1 | y = np.array([[[1, 2, 3], |
用jupyter跑一下代码,结果依然是对的。
今天差不多就先到这里了,目前只能说明我的想法初步看是对的,后续还要再继续验证。如果我的想法是对的,那对于三维数组的理解就又多了一种,思路也就多了一种。
至于四维及以上的数组,后续再说吧,生活在三维的世界的我,实在暂时理解不了四维的世界…