【问题标题】:Get index of closest value to x in an array获取数组中与 x 最接近的值的索引
【发布时间】:2021-02-24 00:59:28
【问题描述】:

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

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,以此类推。

【问题讨论】:

  • 效率是否值得关注?你的数组有多大
  • @Reti43 是的,技术英语还不是很好。对于 values 数组中的第一项,我想在第二列值为 0 的其他数组第一列中找到最接近的值,对于 values 中的第二个值,在第二列中的值为 1 的数组中找到最接近的值等等
  • @PeterMølgaardPallesen 该数组大约有 500 个项目长,它确实运行了大约 10 次,所以我认为它并不那么重要

标签: python numpy numpy-ndarray


【解决方案1】:

代码

a = np.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 = np.array([0.282346788535, 0.296778235123, 0.303451234094, 0.31941237861])

diff = np.abs(a[:,0,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 其中a[:,1] != 0,第二列的值为a[:,1] != 1

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

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

【讨论】:

  • 这很有帮助,解释也很好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-05
  • 2012-10-30
  • 2014-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多