【问题标题】:rearrange 3d numpy array with list of indices用索引列表重新排列 3d numpy 数组
【发布时间】:2018-08-03 23:12:20
【问题描述】:

我有一个尺寸为 333*333*52 的 3 维 numpy 数组

我有一个 333 个元素的索引列表,范围从 0 到 332,例如 [4 12 332 0 ...],我希望用它来重新排列 3d 数组的前两个维度

在 matlab 中我会这样做:

rearranged_array = original_array(new_order, new_order, :)

但这种方法不适用于 numpy:

rearranged_array = original_array[new_order, new_order, :]

产生一个 333*52 的数组

同时:

rearranged_array = original_array[new_order][new_order, :]

没有按正确的顺序处理事情

编辑:

这似乎有效:

rearranged_array = original_array[new_order, :][:, new_order]

这对我来说似乎比 matlab 方法更不直观 - 有没有更好的方法?

【问题讨论】:

    标签: python numpy indexing


    【解决方案1】:

    你的第三个

    rearranged_array = original_array[new_order][new_order, :]
    

    只是做了两次相同的操作。

    你想要的

    rearranged_array = original_array[new_order][:, new_order]
    

    您的第一个解决方案不起作用的原因是,numpy 仅在传递的索引是列表或数组时才进行重新排列,但如果您传递 new_order, new_order,那是一个元组。

    另一种解决方案是这样做

     rearranged_array = original_array[np.row_stack((new_order, new_order))]
    

    注意。你继续做a[x, y, :]a[x, :]之类的事情。尾随 : 是多余的。 a[x, y]a[x] 分别做同样的事情。

    【讨论】:

    • 我不会说尾随 : 是多余的。代码不需要它们,因为它们会被推断出来。但人类经常需要它们来保持尺寸正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    • 2016-08-24
    相关资源
    最近更新 更多