最接近某个值的元素(逐元素,numpy 数组)

Posted

技术标签:

【中文标题】最接近某个值的元素(逐元素,numpy 数组)【英文标题】:Closest element to a value (Elementwise, numpy array) 【发布时间】:2021-02-11 01:47:01 【问题描述】:

我曾经使用min([a, b], key=lambda x:abs(x-x0)) 来查找ab 中的哪一个最接近x0

a = 1
b = 2
x0 = 1.49
print(min([a, b], key=lambda x:abs(x-x0)))
# >>> 1

现在,ab 是具有任意维数的 numpy 数组。我想构建一个由两个数组之间最接近 x0 的值组成的数组,逐个元素。

import numpy as np

a = np.array([[1, 2], [3, 5]])
b = np.array([[6, 2], [6, 2]])

## case 1
x0 = 4
# >>> should return np.array([[6, 2], [3, 5]])

## case 2
x0 = np.array([[1, 2], [3, 4]])
# >>> should return np.array([[1, 2], [3, 5]])

要找到两个数组之间的元素最小值,我们可以使用numpy.minimum。 不幸的是,它不接受 lambda 函数作为参数。

我该怎么办?

【问题讨论】:

arbitrary number of dimensions 有点武断。它们的尺寸是否相等,它们与x0 的尺寸有什么关系?你手头有样品吗? 就我而言,x0 是一个浮点数。 ab 的维度应该不会在这个问题中发挥作用,尽快a.shape == b.shape 吧? 可以加minimal reproducible example吗? 【参考方案1】:

numpy 不支持按键功能。一个可能的解决方法是将距离存储在一个单独的数组中,并使用np.argmin 确定最小距离的索引。一个 4D 点的例子:

points = np.array([[0, 0.1, 0.2, 0.3], [3, 4, 5, 5], [6, 4.5, 1, 1]])
x0 = [3, 0.5, 5, 5]
distances = np.sum((points - x0)**2, axis=1)
output = points[np.argmin(distances)]

输出:

array([3., 4., 5., 5.])

【讨论】:

【参考方案2】:

这是你要找的吗?

np.where(np.abs(a - x0) < np.abs(b - x0), a, b)

【讨论】:

我认为有一个错误:np.abs(a - x0) &lt; np.abs(a - x0) 应该是np.abs(a - x0) &lt; np.abs(b - x0) 对吧? 这仅适用于 ab 两个点,我的解决方案适用于任何点列表。

以上是关于最接近某个值的元素(逐元素,numpy 数组)的主要内容,如果未能解决你的问题,请参考以下文章

在 numpy 数组中查找与所有其他行相比具有最小值的行

如何对 NumPy 数组执行逐元素布尔运算 [重复]

如何对 NumPy 数组执行逐元素布尔运算 [重复]

如何使用逐元素操作获取多个 numpy 保存的数组的均值和标准

numpy多维数组元素筛选

numpy多维数组元素筛选