2022-04-06

求索集 第二 - 你们还...

求索集 第二 - 你们还是对我这个宝宝动手了

果然, 我还是飘了.

封面

一本400页的书, 一气就读到了100页, 看起来一切都很顺利的样子, 有一瞬间我甚至怀疑难道不注意之下, 我加了什么装备, 或者双脚离地了, 所以聪明的智商又占领高地了???

然后今天学到数组转置, 晕头转向之下, 我终于回到了现实, 果然, 你们还是对我这个宝宝动手了. 之前还觉得自己还挺不错的,原来是错觉, 都是错觉呀.

二维数组的转置不难理解,X轴变Y轴,行列变换就是了。但是从二维到三维,问题一下子就难了不少,而且还多了轴的概念。比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
已知三维数组:
y = np.array([[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]],
[[11, 12, 13],
[14, 15, 16],
[17, 18, 19]],
[[21, 22, 23],
[24, 25, 26],
[27, 28, 29]]])
求:y.transpose(1,0,2)
答:
array([[[ 1, 2, 3],
[11, 12, 13],
[21, 22, 23]],

[[ 4, 5, 6],
[14, 15, 16],
[24, 25, 26]],

[[ 7, 8, 9],
[17, 18, 19],
[27, 28, 29]]])

人家教材是真讲理, 写个代码, 眨眼间计算机就给算出来了。照理说没错呀,数据分析,可不计算工作都是交给计算机么。 问题是简单的计算原理我得会呀,不然我学什么呢?显然,照着问题和答案研究解题原理是不可能了,咱们按部就班,一个一个问题解决。

前提问题一: 如果说二维数组的轴就是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
2
3
4
5
6
7
8
9
10
y = np.array([[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]],
[[11, 12, 13],
[14, 15, 16],
[17, 18, 19]],
[[21, 22, 23],
[24, 25, 26],
[27, 28, 29]]])
求:y.transpose(1,0,2)
三维数组的轴

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
y = np.array([[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]],
[[11, 12, 13],
[14, 15, 16],
[17, 18, 19]],
[[21, 22, 23],
[24, 25, 26],
[27, 28, 29]]])
求:y.transpose(1,0,2)
答:
y.transpose(1,0,2) = np.array
([[[1, 2, 3],
[11, 12, 13],
[21, 22, 23]],
[[4, 5, 6],
[14, 15, 16],
[24, 25, 26]],
[[7, 8, 9],
[17, 18, 19],
[27, 28, 29]]])

用jupyter跑一下代码,结果是对的。 咱们继续验证:

求y.transpose(2,1,0)。

按照刚才我的推断, 这次是2和0轴交换,1没变,那就是说明原来的行之间关系不变,123下面还是456,但表之间的联系变成了原来的数列元素,也就是原来在同一二维数组的同一数列的1,2,3,现在要分别属于不同的数组了, 我们写一写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
y = np.array([[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]],
[[11, 12, 13],
[14, 15, 16],
[17, 18, 19]],
[[21, 22, 23],
[24, 25, 26],
[27, 28, 29]]])
求:y.transpose(2,1,0)
答:
y.transpose(1,0,2) = np.array
([[[1, 11, 21],
[4, 14, 24],
[7, 17, 27]],
[[2, 12, 22],
[5, 15, 25],
[8, 18, 28]],
[[3, 13, 23],
[6, 16, 26],
[9, 19, 29]]])

用jupyter跑一下代码,结果依然是对的。

今天差不多就先到这里了,目前只能说明我的想法初步看是对的,后续还要再继续验证。如果我的想法是对的,那对于三维数组的理解就又多了一种,思路也就多了一种。

至于四维及以上的数组,后续再说吧,生活在三维的世界的我,实在暂时理解不了四维的世界…