Python 通过二维索引对三维numpy数组进行排序
我真的有麻烦了。我有一个三维numpy数组,我想用一个二维索引数组对它重新排序。实际上,阵列将通过编程确定,三维阵列可能是二维或四维的,但为了简单起见,如果两个阵列都是二维的,那么这里给出了期望的结果:Python 通过二维索引对三维numpy数组进行排序,python,arrays,numpy,Python,Arrays,Numpy,我真的有麻烦了。我有一个三维numpy数组,我想用一个二维索引数组对它重新排序。实际上,阵列将通过编程确定,三维阵列可能是二维或四维的,但为了简单起见,如果两个阵列都是二维的,那么这里给出了期望的结果: ph = np.array([[1,2,3], [3,2,1]]) ph_idx = np.array([[0,1,2], [2,1,0]]) for sub_dim_n, sub_dim_ph_idx in enumerate(ph_idx): ph[sub_dim_n] = ph[s
ph = np.array([[1,2,3], [3,2,1]])
ph_idx = np.array([[0,1,2], [2,1,0]])
for sub_dim_n, sub_dim_ph_idx in enumerate(ph_idx):
ph[sub_dim_n] = ph[sub_dim_n][sub_dim_ph_idx]
这使ph阵列成为:
array([[1, 2, 3],
[1, 2, 3]])
这正是我想要的。如果是同样的情况,请任何人帮忙,但我有一个三维阵列(psh),而不是ph,比如:
希望这是清楚的,如果不是,请询问。提前谢谢 如果你想得到一个
ph.shape
形状数组,你可以简单地np.挤压ph_ixs
使形状匹配,并使用它来索引ph
:
print(ph)
[[[1 2 3]]
[[3 2 1]]]
print(ph_idx)
[[0 1 2]
[2 1 0]]
np.take_along_axis(np.squeeze(ph), ph_idx, axis=-1)
array([[1, 2, 3],
[1, 2, 3]])
因此,这里的有用注释中已经提供了线索,但为了完整性起见,使用np.take_沿_轴和2d数组的广播版本非常简单:
psh = np.array(
[[[1,2,3]],
[[3,2,1]]]
)
ph_idx = np.array(
[[0,1,2],
[2,1,0]]
)
np.take_along_axis(psh, ph_idx[:, None, :], axis=2)
如果三维阵列具有多个元素的dim1,则此功能也可以工作:
psh = np.array(
[[[1,2,3],[4,5,6],[7,8,9]],
[[3,2,1],[6,5,4],[9,8,7]]]
)
ph_idx = np.array([[0,1,2], [2,1,0]])
np.take_along_axis(psh, ph_idx[:, None, :], axis=2)
给
array([[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]],
[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]])
在你的三维案例中,ph_idx
的例子是什么?@fuglede-这将是(对这里的格式表示歉意)np。数组([[[1,2,3]],[[1,2,3]])的格式非常好。这次不是[3,2,1]
?您能否提供一个例子,说明ph
具有形状(2,2,3)
?因此,我没有把这一点放在问题中,因为我不想使事情过于复杂,但ph的dim1长度可能大于1(如您建议的2,2,3形状)。如果是这样,我正在尝试应用二维数组。在类似numpy伪代码的东西中,这将是ph[ph_idx[:,None,:]ph
是他们示例中的三维数组,而不是ph_idx
。这就是说,np的一些变化。沿着u轴取u可能就是他们想要的。这对我来说是一个新函数!至少在1.10版上不可用。谢谢-我同意-沿轴取看起来像这里要使用的函数。@Chrisper:如果你所有的例子都遵循你所概述的,你甚至不需要np。挤压;普通的np。沿着轴取下\u
来完成这项工作。@yatu:如果你使用OP评论中的ph\u idx
,你甚至可以将np.挤压放在ph
上。
array([[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]],
[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]])