替换numpy数组中所有元素的最快方法

时间:2017-05-21 13:18:41

标签: python arrays numpy

我正在尝试使用映射规则找到使用另一个元素替换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数组指定datatrans之间所需的对应关系。

我想得到的结果是:

array([[11, 12, 13], [14, 15, 16], [27, 28, 29], [11, 12, 13], [27, 25, 26]])

上面写的数组中的每个元素都是data中元素与trans中相应元素之间的总和。

我试图避免for loops,因为实际上我的datatrans数组更大,但无法找出合适的矢量化函数。

请你给我一些帮助吗?

1 个答案:

答案 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]])