如何比较两个数组并在Python中找到最佳匹配?

时间:2015-04-28 07:30:20

标签: python arrays numpy scipy

我有两个数组X和Y,X是基数组,Y是循环操作。当循环运行时,我想比较数组以找到Y到X的最近值,或者换句话说,哪里是Y最接近X.作为示例,我附加了可重现的代码:

from __future__ import division
import numpy as np
import matplotlib.pyplot as plt
from scipy import interpolate


x = np.array([[0.12, 0.11, 0.1, 0.09, 0.08],
       [0.13, 0.12, 0.11, 0.1, 0.09],
       [0.15, 0.14, 0.12, 0.11, 0.1],
       [0.17, 0.15, 0.14, 0.12, 0.11],
       [0.19, 0.17, 0.16, 0.14, 0.12],
       [0.22, 0.19, 0.17, 0.15, 0.13],
       [0.24, 0.22, 0.19, 0.16, 0.14],
       [0.27, 0.24, 0.21, 0.18, 0.15],
       [0.29, 0.26, 0.22, 0.19, 0.16]])

y = np.array([[0.07, 0.06, 0.05, 0.04, 0.03],
              [0.08, 0.07, 0.06, 0.05, 0.04],
              [0.10, 0.09, 0.07, 0.06, 0.05],
              [0.14, 0.12, 0.11, 0.09, 0.08],
              [0.16, 0.14, 0.13, 0.11, 0.09],
              [0.19, 0.16, 0.14, 0.12, 0.10],
              [0.22, 0.20, 0.17, 0.14, 0.12],
              [0.25, 0.22, 0.19, 0.16, 0.13],
              [0.27, 0.24, 0.20, 0.17, 0.14]])


for i in range(100):
    y = y + (i / 10000)

我想在找到最接近的值时打破循环。 最接近的意思是,值应该在原始值的±10%或其他百分比之内。如何在Python中完成?

1 个答案:

答案 0 :(得分:3)

您可以计算两个矩阵之间的欧几里德距离:

import numpy as np
import scipy.spatial.distance
import matplotlib.pyplot as plt
x = np.array([[0.12, 0.11, 0.1, 0.09, 0.08],
   [0.13, 0.12, 0.11, 0.1, 0.09],
   [0.15, 0.14, 0.12, 0.11, 0.1],
   [0.17, 0.15, 0.14, 0.12, 0.11],
   [0.19, 0.17, 0.16, 0.14, 0.12],
   [0.22, 0.19, 0.17, 0.15, 0.13],
   [0.24, 0.22, 0.19, 0.16, 0.14],
   [0.27, 0.24, 0.21, 0.18, 0.15],
   [0.29, 0.26, 0.22, 0.19, 0.16]])
y = np.array([[0.07, 0.06, 0.05, 0.04, 0.03],
          [0.08, 0.07, 0.06, 0.05, 0.04],
          [0.10, 0.09, 0.07, 0.06, 0.05],
          [0.14, 0.12, 0.11, 0.09, 0.08],
          [0.16, 0.14, 0.13, 0.11, 0.09],
          [0.19, 0.16, 0.14, 0.12, 0.10],
          [0.22, 0.20, 0.17, 0.14, 0.12],
          [0.25, 0.22, 0.19, 0.16, 0.13],
          [0.27, 0.24, 0.20, 0.17, 0.14]])

dists = []
for i in range(100):
     y = y + (i / 10000.)
     dists.append(scipy.spatial.distance.euclidean(x.flatten(), y.flatten()))
plt.plot(dists)

将返回此图,这是两个矩阵之间欧几里德距离的演变: enter image description here

要将循环打破至少,您可以使用:

dist = np.inf
for i in range(100):
    y = y + (i / 10000.)
    d = scipy.spatial.distance.euclidean(x.flatten(), y.flatten())
    if d < dist:
        dist = d
    else:
        break
print dist
# 0.0838525491562 #(the minimal distance)
print y
#[[ 0.1051  0.0951  0.0851  0.0751  0.0651] 
#[ 0.1151  0.1051  0.0951  0.0851  0.0751] 
#[ 0.1351  0.1251  0.1051  0.0951  0.0851] 
#[ 0.1751  0.1551  0.1451  0.1251  0.1151] 
#[ 0.1951  0.1751  0.1651  0.1451  0.1251] 
#[ 0.2251  0.1951  0.1751  0.1551  0.1351] 
#[ 0.2551  0.2351  0.2051  0.1751  0.1551] 
#[ 0.2851  0.2551  0.2251  0.1951  0.1651] 
#[ 0.3051  0.2751  0.2351  0.2051  0.1751]]