我正在尝试使用映射规则找到使用另一个元素替换numpy数组中的元素的最快方法。我会举一个例子,因为我认为这样做最清楚。
假设我们有这3个数组:
data = np.array([[1,2,3], [4,5,6], [7,8,9], [1,2,3], [7,5,6]])
map = np.array([0, 0, 1, 0, 1])
trans = np.array([[10,10,10], [20,20,20]])
map
数组指定data
和trans
之间所需的对应关系。
我想得到的结果是:
array([[11, 12, 13], [14, 15, 16], [27, 28, 29], [11, 12, 13], [27, 25, 26]])
上面写的数组中的每个元素都是data
中元素与trans
中相应元素之间的总和。
我试图避免for loops
,因为实际上我的data
和trans
数组更大,但无法找出合适的矢量化函数。
请你给我一些帮助吗?
答案 0 :(得分:1)
使用trans
的索引将map
索引到trans
,根据索引选择行data
,作为选择的行索引,然后只需添加{{1} } -
data+trans[map]
进行原位编辑 -
data += trans[map]
提醒:对于映射数组,我会使用另一个变量名而不是map
,这也是Python built-in
以避免任何不良行为。
示例运行 -
In [23]: data = np.array([[1,2,3], [4,5,6], [7,8,9], [1,2,3], [7,5,6]])
...: map1 = np.array([0, 0, 1, 0, 1])
...: trans = np.array([[10,10,10], [20,20,20]])
...:
In [24]: trans[map1]
Out[24]:
array([[10, 10, 10],
[10, 10, 10],
[20, 20, 20],
[10, 10, 10],
[20, 20, 20]])
In [25]: data + trans[map1]
Out[25]:
array([[11, 12, 13],
[14, 15, 16],
[27, 28, 29],
[11, 12, 13],
[27, 25, 26]])