簡體   English   中英

重新排列 numpy 二維數組的列

[英]Rearrange columns of numpy 2D array

有沒有辦法將 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM