如何在Python中有效地将任意重映射应用于矩阵

时间:2015-12-03 10:55:49

标签: python-2.7 numpy dictionary reshape remap

我想在Python 2.7中重新映射一个矩阵,但重新排序模式不遵循简单的规则。我有一个(192,1024)numpy源数组开始,并希望最终得到一个(768,250)目标数组。请注意,某些列将在进程中转储,并且生成的数组的元素少于原始数组。此外,行和列是乱码。我创建了一个minimal working example来做我想做的事情,请注意目标数组的第62列和第187列是如何交错的。

现在我正在寻找一种方法来加快转换速度。到目前为止,我提出了两个想法:

  1. 与源数组大小相同的映射矩阵,其中包含具有目标坐标
  2. 的元组
  3. 一个映射字典,其键包含源坐标,其值包含目标坐标
  4. 最小的例子还创建了映射矩阵和映射字典,但我不知道如何继续。应用这种非常随意的映射的最有效方法是什么?我很感激任何小费!

1 个答案:

答案 0 :(得分:0)

最简单的方法是使用两个大小为(768, 250)的2D数组(目标数组的大小)。然后,您提供这两个数组(比如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]]