获取数组中最接近 x 的值的索引

问题描述

我有一个看起来像这样的数组(虽然它更长):

array ['0.2742330338168506' '0']
      ['0.28529288153011745' '0']
      ['0.28595917620794253' '1']
      ['0.2874392369724381' '2']
      ['0.316557712713994' '2']
      ['0.32113534393276466' '3']
      ['0.3231108855082745' '3']
      ['0.3163219663513872' '3']

一个数组 values,它们是第二列中每个值的平均值。

 values['0.282346788535' '0.296778235123' '0.303451234094' '0.31941237861']

对于 values 中的第一项,我想在第二列值为 0 的另一个数组的第一列中找到最接近的值的索引,对于 values 中的第二个值最接近在第二列中的值为 1 的数组中,依此类推。

解决方法

代码

a = np.array([[0.2742330338168506,0],[0.28529288153011745,[0.28595917620794253,1],[0.2874392369724381,2],[0.316557712713994,[0.32113534393276466,3],[0.3231108855082745,[0.3163219663513872,3]])
values = np.array([0.282346788535,0.296778235123,0.303451234094,0.31941237861])

diff = np.abs(a[:,None] - values)
mask =  a[:,1,None] != np.arange(len(values))
diff[mask] = np.inf
idx = np.argmin(diff,axis=0)

结果

array([1,2,4,5],dtype=int64)

说明

diff 创建 a[:,0]values 中每个元素之间绝对差的矩阵。

array([[0.00811375,0.0225452,0.0292182,0.04517934],[0.00294609,0.01148535,0.01815835,0.0341195 ],[0.00361239,0.01081906,0.01749206,0.0334532 ],[0.00509245,0.009339,0.016012,0.03197314],[0.03421092,0.01977948,0.01310648,0.00285467],[0.03878856,0.02435711,0.01768411,0.00172297],[0.0407641,0.02633265,0.01965965,0.00369851],[0.03397518,0.01954373,0.01287073,0.00309041]])

mask 创建一个形状相似的矩阵,其中第一列的值是 True where a[:,1] != 0,第二列的值 where a[:,1] != 1 等>

array([[False,True,True],[False,[ True,False,False],False]])

通过将这些值设置为无穷大,我们可以专注于每列的相关值,用np.argmin()找到最小值的索引。