看这个:相互转化
三维数组x,x.shape是(2,6,2)。
其中第一个维度有两个元素,(第一个大括号里的)
第一个元素是[[0,2],[1,2],[1,3],[1,4],[2,1],[3,2]];
第二个元素是[[1,1],[2,2],[3,3],[4,4],[5,5],[6,6]];
而第二个维度是指第一维度的每一个元素单独进行细分,
即在第一维度第一个元素上的第二维度元素有六个分别是[0,2],[1,2],[1,3],[1,4],[2,1],[3,2];
第一维度第二个元素上的第二维度元素也有六个分别是[1,1],[2,2],[3,3],[4,4],[5,5],[6,6];
第三维度同理,所以在第一维度第一个元素的第二维度的第一个元素上的第三维度的元素有两个即0,2;其他同理。
- x[n]:指第一维度的第n个元素
- x[:,n]
前面有两个括号,就是两维。
对应
a[第0维,第1维,第2维,第3维]
a[:,2]的输出是[2 5 8]。注意是a[:,2]而不是a[:2],有个逗号在里面,这是对维度进行操作的显著标志。怎么理解呢?在这种情况下,把“:”理解为all,然后从后往前看可能会更清晰一点。比如在a[:,2]中,从后往前看2表示取出第1维的第2列,“:”表示取出第0维的所有列。这样就会得到[2 5 8]
a = np.arange(120).reshape(2,3,4,5)
得到shape为(2,3,4,5)的张量a,输出a为
[[[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[ 10 11 12 13 14]
[ 15 16 17 18 19]]
[[ 20 21 22 23 24]
[ 25 26 27 28 29]
[ 30 31 32 33 34]
[ 35 36 37 38 39]]
[[ 40 41 42 43 44]
[ 45 46 47 48 49]
[ 50 51 52 53 54]
[ 55 56 57 58 59]]]
[[[ 60 61 62 63 64]
[ 65 66 67 68 69]
[ 70 71 72 73 74]
[ 75 76 77 78 79]]
[[ 80 81 82 83 84]
[ 85 86 87 88 89]
[ 90 91 92 93 94]
[ 95 96 97 98 99]]
[[100 101 102 103 104]
[105 106 107 108 109]
[110 111 112 113 114]
[115 116 117 118 119]]]]
对应
a[第0维,第1维,第2维,第3维]
假如我要输出a[:,2,:,4]
,从后往前看就是,取出最后一维(第三维)的第4列(红色框),取出第2维所有列,取出第1维的第2列(黄色框),取出第0维的所有列
最后输出的结果就是红黄框交界的地方的值:
[[ 44, 49, 54, 59],
[104, 109, 114, 119]]
同时也可以看到,输出结果的shape变成了两维。因此对于一个numpy多维array,[:,:,:,:,…,:],将多少个“:”替换为具体的值,最后的结果就降低几维。
-
“…”在numpy中的操作
可以看作是对x的复制,而不是x本身 -
“…”在numpy中的操作
“…”在什么地方出现呢,当你要处理的多维array维度过高,而且你只处理其中的前几维或后几维,那么剩下的维度,就可以用“…”代替了。比如a[1,…]就是将a第0维的第1列取出,得到
[[[ 60 61 62 63 64]
[ 65 66 67 68 69]
[ 70 71 72 73 74]
[ 75 76 77 78 79]]
[[ 80 81 82 83 84]
[ 85 86 87 88 89]
[ 90 91 92 93 94]
[ 95 96 97 98 99]]
[[100 101 102 103 104]
[105 106 107 108 109]
[110 111 112 113 114]
[115 116 117 118 119]]]