代码:
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]])
我不想使用循环的原因是因为我认为矢量化可以加速计算。我有两个大型a
和b
。但是我不确定此操作是否可以利用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个副本。