gpt4 book ai didi

python - NumPy 数组 : Efficiently find matching indices

转载 作者:太空狗 更新时间:2023-10-29 22:09:52 25 4
gpt4 key购买 nike

我有两个列表,其中一个很大(数百万个元素),另一个有几千个。我要执行以下操作

bigArray=[0,1,0,2,3,2,,.....]

smallArray=[0,1,2,3,4]

for i in len(smallArray):
pts=np.where(bigArray==smallArray[i])
#Do stuff with pts...

上面的工作,但很慢。有没有什么方法可以更有效地做到这一点而无需诉诸于用 C 编写一些东西?

最佳答案

在您的情况下,您可能会受益于对大数组进行预排序。下面是演示如何将时间从大约 45 秒减少到 2 秒的示例(在我的笔记本电脑上)(对于数组 5e6 与 1e3 的一组特定长度)。显然,如果数组大小大相径庭,则解决方案将不是最佳解决方案。例如。使用默认解决方案,复杂度为 O(bigN*smallN),但对于我建议的解决方案,它是 O((bigN+smallN)*log(bigN))

import numpy as np, numpy.random as nprand, time, bisect

bigN = 5e6
smallN = 1000
maxn = 1e7
nprand.seed(1)
bigArr = nprand.randint(0, maxn, size=bigN)
smallArr = nprand.randint(0, maxn, size=smallN)

# brute force
t1 = time.time()
for i in range(len(smallArr)):
inds = np.where(bigArr == smallArr[i])[0]
t2 = time.time()
print "Brute", t2-t1

# not brute force (like nested loop with index scan)
t1 = time.time()
sortedind = np.argsort(bigArr)
sortedbigArr = bigArr[sortedind]
for i in range(len(smallArr)):
i1 = bisect.bisect_left(sortedbigArr, smallArr[i])
i2 = bisect.bisect_right(sortedbigArr, smallArr[i])
inds = sortedind[i1:i2]
t2=time.time()
print "Non-brute", t2-t1

输出:

蛮力 42.5278530121

非暴力破解 1.57193303108

关于python - NumPy 数组 : Efficiently find matching indices,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10320751/

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