gpt4 book ai didi

python - 重新排序 3D-Numpy 数组

转载 作者:行者123 更新时间:2023-11-30 22:05:06 25 4
gpt4 key购买 nike

我有一个 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]]]])

现在我想 reshape 该数组,将特定值分组在一起,即

 >>> a[0,:,0,0]
array([9, 9, 9, 3])

所以基本上,我希望每个框的第一个元素位于一个数组中,每个框的第二个元素位于另一个数组中,依此类推。

到目前为止我所做的是将其 reshape 为以下内容:

>>> 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)])

最佳答案

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]]])

关于python - 重新排序 3D-Numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53103071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com