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

How to efficiently apply an arbitrary remapping to a matrix in Python

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

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

  1. 与源数组大小相同的映射矩阵,其中包含具有目标坐标的元组
  2. 一个映射字典,其键包含源坐标,其值包含目标坐标

最小的例子也创建了映射矩阵和映射字典,但我不知道如何进行。应用这种相当随意的映射的最有效方法是什么?我很感激任何提示!

最简单的方法是使用两个大小为 (768, 250)(目标数组的大小)的二维数组。然后您提供这两个数组(例如 inds1inds2 作为原始数组的索引(因此 data2 = data[inds1, inds2])。这两个数组给出了应该复制到的源数组的坐标目标数组中的相应位置。

假设第一个数组在 [10, 11] 位置有 5,而第二个数组在 [10, 11] 位置有 968。这意味着目标数组的位置 [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]]