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

3

我曾经使用min([a, b], key=lambda x:abs(x-x0))来找出哪个数abx0更近。

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函数作为参数。

我该怎么办?


“任意数量的维度”有些随意。它们的维度是否相等,以及它们与“x0”的维度有何关系?您手头有样例吗? - Quang Hoang
在我的情况下,x0 是一个单精度浮点数。ab 的维度在这个问题中不应该起作用,只要 a.shape == b.shape,对吗? - Liris
你能添加 [mcve] 吗? - Divakar
2个回答

1
这是您正在寻找的内容吗?
np.where(np.abs(a - x0) < np.abs(b - x0), a, b)

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

0

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.])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接