【发布时间】:2022-01-13 23:44:44
【问题描述】:
问题描述
假设我们有两个简单的数组:
query = np.array([100, 4000, 500, 700, 400, 100])
match = np.array([6, 100, 4000, 100, 10, 8, 10])
我想在查询和匹配之间找到所有匹配值的索引。所以在这种情况下,结果将是:
value query match
100 0 1
100 0 3
100 5 1
100 5 3
4000 1 2
实际上这些数组将包含数百万个项目
“愚蠢的”循环解决方案
qs = []
query_locs = []
match_locs = []
for i in np.arange(query.size):
q = query[i]
# Get matching indexes in "match"
match_loc = np.where(match == q)[0]
n = match_loc.size
# Update location arrays
match_locs.extend(match_loc)
query_locs.extend(np.repeat(i,n))
# Store the matching value
qs.extend(np.repeat(q,n))
result = np.vstack((qs, query_locs, match_locs)).T
print(result)
[[ 100 0 1]
[ 100 0 3]
[4000 1 2]
[ 100 5 1]
[ 100 5 3]]
(也许numba 可以使这个循环非常快,但是当我尝试这个时,我得到了一些关于签名的错误,所以不确定)
Numpy 构建
有相当多的内置 numpy 函数可以解决此问题的唯一值,例如使用 searchsorted、intersect1d,但是,正如文档中所述,它们“返回已排序的唯一值”,因此不考虑到重复。 StackOverflow 上针对此问题的一些具有唯一值的示例:
- NumPy: Comparing Elements in Two Arrays
- Efficient way to compute intersecting values between two numpy arrays
我可以想象会有一种 更快 的方法来使用 numpy 而不是循环来做到这一点,所以很想看到答案!
【问题讨论】:
标签: python arrays numpy performance