[英]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.