Python 通过二维索引对三维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

我真的有麻烦了。我有一个三维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[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]]])