有效地重新排列多维数组的列

rearrange columns of multidimensional arrays efficiently

我相当确定这个问题有一个几乎微不足道的解决方案,但就我的生活而言,我现在似乎无法弄清楚,也无法在网上找到任何东西,所以请耐心等待。

我有一个大小为 (n x m x m) 的 3D 数组,称为 v(将其视为 n (m x m) 矩阵。) 我希望根据从排序中获得的索引重新排列每个矩阵中的列。

因此我有索引,idxs,(n x m),我希望用它重新排列矩阵。

现在我可以这样重新排列了:

V = np.empty_like(v)
for i in range(v.shape[0]):
    V[i,:,np.arange(len(idxs[0]))] = v[i,:,idxs[i,:]]

但这是一个非常慢的操作。

有没有人有更好的方法来重新排列?

使用迭代器作为 ranged-array for advanced-indexing 的矢量化方式 -

I = np.arange(v.shape[0])[:,None]
V[I,:,np.arange(len(idxs[0]))] = v[I,:,idxs]

另一个简单地索引到 v 直接得到 V -

V = v[np.arange(v.shape[0])[:,None],:,idxs].swapaxes(1,2)