2015-12-03 25 views
0

我想在Python 2.7中重新映射矩陣,但重新排序模式不遵循簡單的規則。我有一個(192,1024)numpy源數組,最後想獲得(768,250)目標數組。請注意,一些柱子在這個過程中被傾倒,並且由此產生的陣列元素比原始元素少。此外,行和列都是混亂的。我創建了一個我想要的minimal working example,請注意目標陣列的列62和列187是如何交錯的。如何在Python中有效地應用任意重新映射到矩陣

現在我正在尋找一種使轉換速度更快的方法。到現在爲止,我想出了兩個想法:

  1. 具有相同大小的源陣列,其中包含的元組與目標映射矩陣座標
  2. 映射詞典,其關鍵字包含源座標,而其值包含目標座標

最小的示例還創建映射矩陣和映射字典,但我不知道如何繼續。什麼是最有效的方式來應用這個相當隨意的映射?我很感激任何提示!

回答

0

最簡單的方法是有兩個尺寸爲(768, 250)(目標數組大小)的二維數組。然後提供這兩個數組(例如說inds1inds2作爲原始數組的索引(所以data2 = data[inds1, inds2])。這兩個數組給出了應複製到目標數組中相應位置的源數組的座標。所以說第一陣列5[10, 11]位置,而第二個有968在位置[10, 11],這將意味着位置的目標數組的[10, 11]具有從源陣列的[5, 968]位置的值。

所以這裏是一個簡化例如:

>>> data = np.arange(10)+np.arange(0, 100, 10)[:,None] 
>>> print(data) 
[[ 0 1 2 3 4 5 6 7 8 9] 
[10 11 12 13 14 15 16 17 18 19] 
[20 21 22 23 24 25 26 27 28 29] 
[30 31 32 33 34 35 36 37 38 39] 
[40 41 42 43 44 45 46 47 48 49] 
[50 51 52 53 54 55 56 57 58 59] 
[60 61 62 63 64 65 66 67 68 69] 
[70 71 72 73 74 75 76 77 78 79] 
[80 81 82 83 84 85 86 87 88 89] 
[90 91 92 93 94 95 96 97 98 99]] 
>>> 
>>> inds1 = np.array([[0, 2, 2], [3, 5, 8]]) 
>>> inds2 = np.array([[2, 7, 1], [8, 2, 8]]) 
>>> 
>>> data2 = data[inds1, inds2] 
>>> print(data2) 
[[ 2 27 21] 
[38 52 88]] 
+0

簡單,優雅,快速,非常感謝! – vueltaconicarus