我有一个3D阵列
>>> a
array([[[[9, 6, 1],
[2, 8, 6],
[3, 5, 6]],
[[9, 1, 9],
[6, 6, 7],
[3, 0, 7]],
[[9, 2, 7],
[6, 1, 4],
[9, 2, 2]],
[[3, 7, 0],
[4, 0, 6],
[7, 4, 8]]]])
现在我要重塑该数组,将特定值组合在一起,即
>>> a[0,:,0,0]
array([9, 9, 9, 3])
所以基本上,我希望每个框的第一个元素在一个数组中,每个框的第二个元素在另一个数组中,依此类推。
到目前为止,我将其重塑为以下内容:
>>> b = a[0,:,:,:].T
>>> b
array([[[9, 9, 9, 3],
[2, 6, 6, 4],
[3, 3, 9, 7]],
[[6, 1, 2, 7],
[8, 6, 1, 0],
[5, 0, 2, 4]],
[[1, 9, 7, 0],
[6, 7, 4, 6],
[6, 7, 2, 8]]])
这样,数组已经被构造好了,但是排序是错误的。这样,将2x4矩阵逐行构造。我希望它是按列构造的,也就是说,在这种情况下,以下应该是前六行:
>>> b[:,0,:]
array([[9, 9, 9, 3],
[6, 1, 2, 7],
[1, 9, 7, 0]])
>>> b[:,1,:]
array([[2, 6, 6, 4],
[8, 6, 1, 0],
[6, 7, 4, 6]])
我一直在摆弄如何索引正确构建数组的索引。考虑问题的一种直观方法是考虑将3x3矩阵彼此堆叠在一起,我想在z方向上切出1x4数组(这样就成堆),并将它们按行放入一个数组中。
我的意思是我可以使用for循环遍历它们,但是我宁愿通过索引和切片对整个对象进行矢量化处理。任何帮助表示赞赏!谢谢
np.concatenate([b[:,i,:] for i in range(3)])
答案 0 :(得分:3)
numpy.transpose(..)
是可以按任意顺序排列轴的功能。
如果我理解正确的话,您基本上希望第三和第四轴是新矩阵的第一和第二轴,而旧的第一和第二矩阵是新的第三和第四轴。
因此,我们可以使用以下方式进行转置:
>>> a.transpose((2,3,0,1))
array([[[[9, 9, 9, 3]],
[[6, 1, 2, 7]],
[[1, 9, 7, 0]]],
[[[2, 6, 6, 4]],
[[8, 6, 1, 0]],
[[6, 7, 4, 6]]],
[[[3, 3, 9, 7]],
[[5, 0, 2, 4]],
[[6, 7, 2, 8]]]])
由于在这里构造了一个4d数组,但是第一个索引只有一个元素,所以最好删除该索引,例如:
>>> a[0,:,:,:].transpose(1,2,0)
array([[[9, 9, 9, 3],
[6, 1, 2, 7],
[1, 9, 7, 0]],
[[2, 6, 6, 4],
[8, 6, 1, 0],
[6, 7, 4, 6]],
[[3, 3, 9, 7],
[5, 0, 2, 4],
[6, 7, 2, 8]]])