你可以使用np.in1d:如果您需要致電np.in1d
爲vals
許多不同的值
In [12]: arr
Out[12]:
array([[100, 1],
[200, 2],
[300, 3],
[400, 4],
[440, 3]])
In [14]: vals = [100, 300]
In [23]: np.in1d(arr[:,0], vals)
Out[23]: array([ True, False, True, False, False], dtype=bool)
In [24]: arr[np.in1d(arr[:,0], vals), 1]
Out[24]: array([1, 3])
,那麼它可以支付準備一個字典作爲arshajii建議,因爲在準備字典後(一個O(n)
操作,其中n = len(arr)
),擡頭看e值將是O(m)
操作,其中m = len(vals)
。
如果n
變得非常大,但是字典可能需要太多內存。在這種情況下,您可能需要使用np.in1d
。
如果指數(鍵)值都是ints
和小幅度的,還有你可以用它來獲取O(m)
性能,而無需使用字典一NumPy的索引招:
In [30]: big = np.full(arr[:,0].max()+1, np.nan)
In [31]: big[arr[:,0]] = arr[:,1]
In [32]: big[vals]
Out[32]: array([ 1., 3.])
準備big
是O(n)
操作,但索引big[vals]
是O(m)
。如果arr[:,0].max()
很小,並且關鍵值是ints
,則使用big
的優點是所需內存少於使用dict
的內存。
In [33]: %timeit arr[np.in1d(arr[:,0], vals), 1]
10000 loops, best of 3: 21.5 µs per loop
In [34]: %timeit big[vals]
1000000 loops, best of 3: 1.23 µs per loop
與arshajii的解決方案比較:
In [38]: d = dict(arr)
In [40]: %timeit [d[k] for k in vals]
1000000 loops, best of 3: 447 ns per loop
所以用最好的方法取決於arr
和vals
,大小你多少次被執行此操作,多少內存你有,如果鑰匙很小ints
。您需要對與您的用例相關的數據進行基準測試,以做出正確的決定。
你想完成什麼操作? – cchristelis