gpt4 book ai didi

python - 向量化 NumPy 数组中的迭代加法

转载 作者:太空狗 更新时间:2023-10-29 20:37:54 24 4
gpt4 key购买 nike

对于二维索引的随机数组中的每个元素(可能有重复项),我想“+=1”到二维零数组中的相应网格。但是,我不知道如何优化计算。使用标准的 for 循环,如下所示,

def interadd():
U = 100
input = np.random.random(size=(5000,2)) * U
idx = np.floor(input).astype(np.int)

grids = np.zeros((U,U))
for i in range(len(input)):
grids[idx[i,0],idx[i,1]] += 1
return grids

运行时间可能非常重要:

>> timeit(interadd, number=5000)
43.69953393936157

有没有办法向量化这个迭代过程?

最佳答案

您可以使用 np.add.at 稍微加快速度,正确处理重复索引的情况:

def interadd(U, idx):
grids = np.zeros((U,U))
for i in range(len(idx)):
grids[idx[i,0],idx[i,1]] += 1
return grids

def interadd2(U, idx):
grids = np.zeros((U,U))
np.add.at(grids, idx.T.tolist(), 1)
return grids

def interadd3(U, idx):
# YXD suggestion
grids = np.zeros((U,U))
np.add.at(grids, (idx[:,0], idx[:,1]), 1)
return grids

给出

>>> U = 100
>>> idx = np.floor(np.random.random(size=(5000,2))*U).astype(np.int)
>>> (interadd(U, idx) == interadd2(U, idx)).all()
True
>>> %timeit interadd(U, idx)
100 loops, best of 3: 8.48 ms per loop
>>> %timeit interadd2(U, idx)
100 loops, best of 3: 2.62 ms per loop

以及YXD的建议:

>>> (interadd(U, idx) == interadd3(U, idx)).all()
True
>>> %timeit interadd3(U, idx)
1000 loops, best of 3: 1.09 ms per loop

关于python - 向量化 NumPy 数组中的迭代加法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31093989/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com