重新排列numpy 2D数组的列

5xu*_*xum 47 python arrays numpy edit-in-place

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

array([[10, 20, 30, 40, 50],
       [ 6,  7,  8,  9, 10]])
Run Code Online (Sandbox Code Playgroud)

我想改成它,比方说

array([[10, 30, 50, 40, 20],
       [ 6,  8, 10,  9,  7]])
Run Code Online (Sandbox Code Playgroud)

通过应用排列

0 -> 0
1 -> 4
2 -> 1
3 -> 3
4 -> 2
Run Code Online (Sandbox Code Playgroud)

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

有一个numpy功能吗?我有一个相当大的矩阵,并期望得到更大的矩阵,所以我需要一个解决方案,如果可能的话,快速到位(排列矩阵是禁止的)

谢谢.

wim*_*wim 71

这可以使用花式索引:

>>> import numpy as np
>>> a = np.array([[10, 20, 30, 40, 50],
...               [ 6,  7,  8,  9, 10]])
>>> your_permutation = [0,4,1,3,2]
>>> i = np.argsort(your_permutation)
>>> i
array([0, 2, 4, 3, 1])
>>> a[:,i]
array([[10, 30, 50, 40, 20],
       [ 6,  8, 10,  9,  7]])
Run Code Online (Sandbox Code Playgroud)

请注意,这是一个副本,而不是视图.由于numpy数组如何跨越内存,因此在一般情况下不可能进行就地置换.

  • OP要求“如果可能的话”。在这种情况下,这是不可能的(由于 ndarray 在内存中的方式) (4认同)
  • 花式索引不会就地改变矩阵。OP 要求就地方法。请看看这个答案:/sf/ask/1667385961/ (3认同)
  • 当然,所以也许指出这不会就地改变矩阵,所以从谷歌到这里的人很清楚? (2认同)

小智 9

我认为最简单的方法是:

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

结果是:

[[10 30 50 40 20]
 [6  8  10 9  7 ]]
Run Code Online (Sandbox Code Playgroud)


Par*_*osh 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)
Run Code Online (Sandbox Code Playgroud)