大约两个列表的操作以索引二维数组



代码:

import numpy as np
a = np.array((1,1,1,1,2))
b = np.array((2,2,2,2,1))
g = np.zeros((3,3),np.int32)
g[a,b] += 1

最后,这应该给出一个数组

array([[0, 0, 0],
       [0, 0, 4],
       [0, 1, 0]])

即。g [1,2]被增加4次,g [2,1]被递增一次,但它给出了

array([[0, 0, 0],
       [0, 0, 1],
       [0, 1, 0]])

我不想使用循环的原因是因为我认为矢量化可以加速计算。我有两个大型ab。但是我不确定此操作是否可以利用Python的矢量化机制来利用性能。而且我不确定我都不了解这个操作。我不知道我应该在Google中搜索哪些关键词,所以我将问题放在这里。

如果有人可以帮助我理解它,那会更好。

这是numpy ufuncs的at方法:

numpy.add.at(g, (a, b), 1)

g[a, b] += 1将执行

temp = g[a, b]
temp += 1
g[a, b] = temp

创建一个带有4个g[1, 2]副本的临时数组,分别增加每个副本,然后通过g[1, 2]分配每个副本(彼此踩踏的作业)。

numpy.add.at(g, (a, b), 1)取而代之的是直接在g数组上执行操作,因此它会增加g[1, 2] 4次,而不是每次递增4个副本。

最新更新