重新排列numpy 2D数组的列



有没有办法将numpy 2D数组中的列的顺序更改为新的任意顺序?例如,我有一个阵列

array([[10, 20, 30, 40, 50],
       [ 6,  7,  8,  9, 10]])

我想把它改成

array([[10, 30, 50, 40, 20],
       [ 6,  8, 10,  9,  7]])

通过应用排列

0 -> 0
1 -> 4
2 -> 1
3 -> 3
4 -> 2

在列上。因此,在新矩阵中,我希望原始矩阵的第一列保持不变,第二列移动到最后一列,依此类推

有numpy函数可以做这件事吗?我有一个相当大的矩阵,希望得到更大的矩阵。所以我需要一个解决方案,如果可能的话,可以快速到位(排列矩阵是不可行的)

谢谢。

这在O(n)时间和O(n)空间中使用花式索引是可能的:

>>> import numpy as np
>>> a = np.array([[10, 20, 30, 40, 50],
...               [ 6,  7,  8,  9, 10]])
>>> permutation = [0, 4, 1, 3, 2]
>>> idx = np.empty_like(permutation)
>>> idx[permutation] = np.arange(len(permutation))
>>> a[:, idx]  # return a rearranged copy
array([[10, 30, 50, 40, 20],
       [ 6,  8, 10,  9,  7]])
>>> a[:] = a[:, idx]  # in-place modification of a

请注意,a[:, idx]返回的是副本,而不是视图。在一般情况下,由于numpy数组在内存中的跨步方式,O(1)空间解决方案是不可能的。

在我看来,最简单的方法是:

a = np.array([[10, 20, 30, 40, 50],
              [6,  7,  8,  9,  10]])
print(a[:, [0, 2, 4, 3, 1]])

结果是:

[[10 30 50 40 20]
 [6  8  10 9  7 ]]

我有一个基于矩阵的解决方案,通过将置换矩阵后乘以原始矩阵。这改变了元素在原始矩阵中的位置

import numpy as np
a = np.array([[10, 20, 30, 40, 50],
       [ 6,  7,  8,  9, 10]])
# Create the permutation matrix by placing 1 at each row with the column to replace with
your_permutation = [0,4,1,3,2]
perm_mat = np.zeros((len(your_permutation), len(your_permutation)))
for idx, i in enumerate(your_permutation):
    perm_mat[idx, i] = 1
print np.dot(a, perm_mat)

如果你正在寻找任何随机置换,如果你将列转置成行,对行进行置换,然后再转置回来,你可以在一行中完成:

a = np.random.permutation(a.T).T

相关内容

  • 没有找到相关文章

最新更新