我想比较两个不同的 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 循环解决它,但这需要很长时间。
这种比较最有效的方法是什么?
最佳答案
我想它会是这样的
i = np.nonzero(np.isclose(A[:,:,None], B[:, 2]))[-1]
np.isclose
接受一些不同的公差参数。
B
中接近 A
值的值将是 B[i, 2]
关于arrays - 如何获得具有公差的两个numpy数组的相似元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46911163/