[英]What is fastest way to check conditions in two python numpy arrays?
[英]Fastest way to lookup from two arrays in python
我有三個相同大小的數組(最長可達5000)。 我必須在前兩個數組中查找對值(這將始終是唯一的),例如ex,(2,3),並因此從相同索引的第三個數組中獲取值。 什么是最快的方法或為此提供任何簡單的python內置庫? 該問題的最簡單解決方案是:
a = [1,1,1,2,2,2,3,3,3,4,4,4]
b = [2,3,4,3,4,5,7,3,2,1,8,9]
c = [4,5,6,13,4,8,80,4,2,3,7,11]
for i in range(0, len(a)):
if a[i] == 2 and b[i] == 3:
fetch = c[i]
找到索引並使用它:
>>> c[zip(a, b).index((2, 3))]
13
或准備一個字典來查找配對:
>>> dict(zip(zip(a, b), c))[2, 3]
13
如果您要查找很多對,而不僅僅是一對,這會更快。 並且可以使用它的get
以防止該對不存在。
您可以對所有列表一起使用帶有next()
和zip()
的生成器表達式:
>>> next((z for x, y, z in zip(a, b, c) if (x, y) == (2, 3)), 'None found')
13
對不同的解決方案進行基准測試,使用長度為10000的列表(類似於所示的列表),並使用Python 2.7.14搜索所有現有的對:
2.380 seconds rajat # The original
1.712 seconds rajat2 # Precomputed range
1.843 seconds rajat3 # xrange instead of range
5.243 seconds stefan1 # zip(a, b).index
0.954 seconds stefan1b # Precomputed zip(a, b).index
16.108 seconds stefan2 # dict
0.002 seconds stefan2b # Precomputed dict
10.782 seconds chris # next(generator)
6.728 seconds chris2 # bit optimized
1.754 seconds chris3 # Precomputed zip(a, b, c)
編碼:
from timeit import timeit
b = range(100) * 100
a = sorted(b)
c = range(10000)
#-------------------------------------------------------------------------
def rajat(A, B):
'The original'
for i in range(0, len(a)):
if a[i] == A and b[i] == B:
return c[i]
def rajat2(A, B, r=range(0, len(a))):
' Precomputed range'
for i in r:
if a[i] == A and b[i] == B:
return c[i]
def rajat3(A, B):
' xrange instead of range'
for i in xrange(0, len(a)):
if a[i] == A and b[i] == B:
return c[i]
def stefan1(A, B):
'zip(a, b).index'
return c[zip(a, b).index((A, B))]
def stefan1b(A, B, index=zip(a, b).index):
' Precomputed zip(a, b).index'
return c[index((A, B))]
def stefan2(A, B):
'dict'
return dict(zip(zip(a, b), c))[A, B]
def stefan2b(A, B, d=dict(zip(zip(a, b), c))):
' Precomputed dict'
return d[A, B]
def chris(A, B):
'next(generator)'
return next((z for x, y, z in zip(a, b, c) if (x, y) == (A, B)), 'None found')
def chris2(A, B):
' bit optimized'
return next((z for x, y, z in zip(a, b, c) if x == A and y == B), 'None found')
def chris3(A, B, abc=zip(a, b, c)):
' Precomputed zip(a, b, c)'
return next((z for x, y, z in abc if x == A and y == B), 'None found')
#-------------------------------------------------------------------------
ab = zip(a, b)
def test():
for A, B in ab:
func(A, B)
for func in rajat, rajat2, rajat3, stefan1, stefan1b, stefan2, stefan2b, chris, chris2, chris3:
t = timeit(test, number=1)
print '%6.3f seconds %-10s # %s' % (t, func.__name__, func.__doc__)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.