如何解决使用numpy构造进行两个数组比较的代码可能更快
我有以下代码计算1 <= i < j <= n
对xs[i] == ys[j]
的对数:
def f(xs,ys):
s = 0
for j in range(xs.size):
s += np.sum(xs[:j] == ys[j])
return s
这在其他一些过程中被称为两次,所以我需要它尽可能快(在某些内存成本上)。
数组的大小为> 1e6
。
是否有一种更快的等效方法可以利用一些麻木般的魔术来摆脱for
循环?
解决方法
如果xs
和ys
的大小相同,一种解决方法:
s = np.triu(xs[:,None]==ys,1).sum()
如果xs
和ys
的大小不同(根据您的代码,您只能将ys
与xs
的长度进行比较。如果要比较{ {1}}与所有xs
,使用上面的行):
ys
或等效地:
s = np.triu((xs[:,None]==ys[:xs.size]),1).sum()
将2-D s = (xs[:,None]==ys)[np.triu_indices(xs.size,1)].sum()
与xs
的所有元素进行比较,然后将上三角的等值求和(与循环的内线相同)
如果数组太大而遇到内存问题,只需对数组进行分块,然后使用上面的行比较对角线上的块以及上三角上的所有非对角线块,并将它们加起来。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。