我有两个大数据数组[100000 x3],分别称为A和B
我想知道一个数组中的任何元素是否存在于另一个数组中。
如果两个数组中的一个条目和另一个条目中的值之间的差值小于1 e-9,那么它们被认为是相同的。
实现这一目标的最有效方法是什么?
我有一个工作示例:
A = np.random.rand(100000, 3)
B = np.random.rand(100000, 3)
B[10] = A[10] + 1e-11
a = []
for entry in A:
if np.min(np.max(np.abs(entry - B), axis=1)) < 1e-9:
a.append(entry)
但是对于这个例子的大小,这将需要我很长时间来检查。
4条答案
按热度按时间ffvjumwh1#
使用
math.isclose()
来测试数字是否在彼此的公差范围内。使用
any()
函数对另一个数组的每个元素进行测试。如果对
B
进行排序,可以改进算法。然后你可以使用二进制搜索来找到接近的元素,而不是线性搜索。bjg7j2ky2#
使用
KDTree
% s高p范数近似于你正在寻找的切比雪夫距离度量,KDTree在两棵树之间进行二叉树搜索,这比顺序搜索方法快得多,比矢量化方法节省内存得多。
yhived7q3#
钝器
我认为我们可以检查舍入值的交集来回答数组是否有公共项的问题:
我同意Barmar的评论,这不是一个准确的工具。我们可以忽略一些小案子。
更精准的工具
这将需要更多的时间,当使用
numba
时,我似乎可以接受,除非有其他要求(在i3-2100 3GHz上,需要4分钟才能得到答案):lndjwyie4#
您可以对数组进行排序以降低复杂性。
示例