【发布时间】:2018-04-06 16:47:42
【问题描述】:
我想找出数组“A”中存在的哪些值也存在于数组“B”中。但是,数组的大小不同,我想引入一个容差,因为两个数据集之间可能存在系统误差。
我知道'np.isclose',但这是针对相同大小的数组。
【问题讨论】:
标签: python arrays python-3.x numpy
我想找出数组“A”中存在的哪些值也存在于数组“B”中。但是,数组的大小不同,我想引入一个容差,因为两个数据集之间可能存在系统误差。
我知道'np.isclose',但这是针对相同大小的数组。
【问题讨论】:
标签: python arrays python-3.x numpy
您可以通过使用稍微更内置的 numpy 解决方案来改进嵌套循环:
import numpy as np
A = np.array([0, 0.3141, 1.234, 4.1341, -34.112])
B = np.array([0.3142, 2.234, 4.1340, -34.113, 40])
res = {i for i in A if np.isclose(B, i, 0.1).any()}
print(res)
输出:
{0.3141, 4.1341, -34.112}
时间安排:
In [2]: %timeit {i for i in A if np.isclose(B, i, 0.1).any()}
276 µs ± 16.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [3]: %timeit {x for x in A for y in B if np.isclose(x, y, atol=0.1)}
1.08 ms ± 12 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
【讨论】:
嵌套的 for 循环会起作用,但我建议你等着看是否有 numpy 解决方案。
import numpy as np
A = np.array([0.3141, 1.234, 4.1341, -34.112])
B = np.array([0.3142, 2.234, 4.1340, -34.113])
res = {x for x in A for y in B if np.isclose(x, y, atol=0.1)}
print(res)
# {-34.112000000000002, 0.31409999999999999, 4.1341000000000001}
【讨论】:
尚不清楚数组是否具有不同尺寸的不同尺寸。如果它们具有相同的维度但不同的大小,使用 Numpy 的内置 intersect1d 很容易计算它们的共同元素:https://docs.scipy.org/doc/numpy/reference/generated/numpy.intersect1d.html
>>> import numpy as np
>>> A = np.array([1, 2, 3, 4, 5, 6])
>>> B = np.array([4, 5, 6, 7])
>>> C = np.intersect1d(A, B)
>>> print C
[4 5 6]
如果它们具有不同的尺寸,您可能必须遵循此处描述的方法:Find common elements in 2D numpy arrays
【讨论】: