2015-12-03 7 views
0

Я хочу переназначить матрицу в Python 2.7, но шаблон переупорядочения не соответствует простым правилам. У меня есть исходный массив (192,1024) numpy для начала, и вы хотите получить целевой массив (768,250) в конце. Обратите внимание, что некоторые из колонок сбрасываются в процессе, и результирующий массив имеет меньше элементов, чем исходный. Кроме того, строки и столбцы скремблируются. Я создал minimal working example, который делает то, что я хочу, обратите внимание, как чередуются столбцы 62 и 187 целевого массива.Как эффективно применить произвольное переназначение к матрице в Python

Теперь я ищу способ ускорить преобразование. До сих пор я придумал две идеи:

  1. матрица отображения с тем же размером, что и исходный массив, который содержит кортежи с целью координаты
  2. словарем отображения, ключи содержат координаты источника, и чьи значения содержат координаты цели

Минимальный пример также создает матрицу сопоставления и словарь сопоставления, но я не знаю, как действовать. Каким будет наиболее эффективный способ применить это довольно произвольное отображение? Я благодарен за любой совет!

ответ

0

Самый простой способ состоит в том, чтобы иметь два 2D-массива размером (768, 250) (размер целевого массива). Затем Вы обеспечиваете эти два массива (скажем inds1 и inds2 как индексы исходного массива (так 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