【问题标题】:How to get similar elements of two numpy arrays with a tolerance如何获得具有容差的两个 numpy 数组的相似元素
【发布时间】:2018-04-05 06:55:39
【问题描述】:

我想比较两个不同 numpy 数组 A 和 B 的列中的值。更具体地说,A 包含来自真实实验的值,我想将其与 B 的第三列中给出的理论值相匹配。

没有完美匹配,因此我必须使用容差,例如0.01。对于 A 中的每个值,我预计 B 中相对于所选公差有 0 到 20 个匹配项。因此,我希望 B 中的那些行在 A 中的值的公差范围内。

更具体地说,这里是一个例子:

A = array([[  2.83151742e+02,   a0],
   [  2.83155339e+02,   a1],
   [  3.29241719e+02,   a2],
   [  3.29246229e+02,   a3]])


B = array([[ 0, 0,  3.29235519e+02, ...],
   [ 0, 0,  3.29240819e+02, ...],
   [ 0, 0,  3.29241919e+02, ...],
   [ 0, 0,  3.29242819e+02, ...]])

所以这里 B 的所有值都将匹配 A[3,0] 和 A[4,0],容差为 0.02。

我的首选结果是 C[:,0] 中 A 的匹配值以及 C[:,1] 中 C[:,0] 和 C[:,2] 之间的差异:

C = array([[ 3.29241719e+02, c0,  3.29235519e+02, ...],
   [ 3.29241719e+02, c1,  3.29240819e+02, ...],
   [ 3.29241719e+02, c2,  3.29241919e+02, ...],
   [ 3.29241719e+02, c3,  3.29242819e+02, ...]
   [ 3.29242819e+02, c4,  3.29235519e+02, ...],
   [ 3.29242819e+02, c5,  3.29240819e+02, ...],
   [ 3.29242819e+02, c6,  3.29241919e+02, ...],
   [ 3.29242819e+02, c7,  3.29242819e+02, ...]])

通常,A 的形状为 (500, 2),B 的形状为 (300000, 11)。我可以用 for 循环解决它,但它需要很长时间。

这种比较最有效的方法是什么?

【问题讨论】:

  • 显示你的循环代码?

标签: arrays python-3.x performance numpy comparison


【解决方案1】:

我想会是这样的

i = np.nonzero(np.isclose(A[:,:,None], B[:, 2]))[-1]

np.isclose 接受几个不同的公差参数。

B 中接近 A 值的值将是 B[i, 2]

【讨论】:

  • 谢谢!对于我当前具有 500 和 30000 个条目的示例,每个循环只需要 5 秒 ± 285 毫秒(平均值 ± 标准偏差,7 次运行,每个循环 1 个)。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-14
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多