在 numpy 中,如何有效地構建從每個唯一值到其索引的映射,而不使用 for 回圈
我考慮了以下替代方案,但它們對于我的用例來說不夠高效,因為我使用大型陣列。
第一種替代方法需要使用for回圈遍歷陣列,這在考慮大型 numpy 陣列時可能會很慢。
import numpy as np
from collections import defaultdict
a = np.array([1, 2, 6, 4, 2, 3, 2])
inv = defaultdict(list)
for i, x in enumerate(a):
inv[x].append(i)
第二種選擇效率不高,因為它需要多次遍歷陣列:
import numpy as np
a = np.array([1, 2, 6, 4, 2, 3, 2])
inv = {}
for x in np.unique(a):
inv[x] = np.flatnonzero(a == x)
編輯:我的 numpy 陣列由整陣列成,用途是用于影像分割。我也在 skimage 中尋找一種方法,但沒有找到。
uj5u.com熱心網友回復:
這應該有效。
a = np.array((1, 2, 6, 2, 4, 7, 25, 6))
fwd = np.argsort(a)
asorted = a[fwd]
keys = np.unique(asorted)
lower = np.searchsorted(asorted, keys)
# or higher = itertools.chain(lower[1:], (len(asorted),))
higher = np.append(lower[1:], len(asorted))
inv = {key: fwd[lower_i:higher_i]
for key, lower_i, higher_i
in zip(keys, lower, higher)}
assert all(np.all(a[indices] == key)
for key, indices in inv.items())
它以 O(n log(n)) 之類的方式運行。剩下的唯一回圈是構建字典的回圈。當然,該步驟是可選的。
從純演算法的角度來看,您的第一種方法 (defaultdict(list)) 會更好,因為它在聚合的線性時間內運行,但當然 python 開銷可能很大。
uj5u.com熱心網友回復:
我建議你檢查一下numba哪些可以顯著加快numpypython 上的代碼 - 它支持numpy.invert()和numpy.unique()-檔案
這是一個很好的視頻,解釋了如何numba從 youtube 上使用 -使用 Numba 使 Python 代碼速度提高 1000 倍
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/414363.html
標籤:
