在维数不匹配的二维数组中基于最近值定位numpy索引

2024-06-17 10:15:22 发布

您现在位置:Python中文网/ 问答频道 /正文

**原文有误。现在数组的维数不相等。 这是个愚蠢的问题,但我找不到正确的答案。 如何索引2d numpy数组中最接近的数字?假设我们有

e = np.array([[1, 2], [4, 5, 6]])

我想找到最接近2的值的索引,以便它返回

^{pr2}$

非常感谢!在


Tags: 答案numpynp数字数组array原文维数
3条回答

这可以通过定义一个作用于一维数组的函数并将其应用于二维数组的行来实现:

e = np.array([[1,2,3], [4,5,6]])

# function to find position of nearest value in 1D array
def find_nearest(a, val):
    return np.abs(a - val).argmin()

# apply it 
np.apply_along_axis(find_nearest, axis = 1, arr = e, val = 2)

通常您会使用np.argwhere(e == 2)

In [4]: e = np.array([[1,2,3],[4,5,6]])

In [6]: np.argwhere(e == 2)
Out[6]: array([[0, 1]])

如果您确实需要指定的输出,您必须添加一个额外的[0]

^{pr2}$

但是,您提供的输入不是标准数字数组,而是object数组,因为len(e[0]) != len(e[1])

In [1]: e = np.array([[1,2],[4,5,6]])

In [3]: e
Out[3]: array([list([1, 2]), list([4, 5, 6])], dtype=object)

这使得numpy的实用性和效率大大降低。你必须采取以下措施:

In [26]: res = []
    ...: for i, f in enumerate(e):
    ...:     g = np.array(f)
    ...:     w = np.argwhere(g==2)
    ...:     if len(w):
    ...:         res += [(i, v) for v in w]
    ...: res = np.array(res)

假设这是一个错误,如果您对最接近2的值感兴趣,即使2不存在,您也必须执行以下操作:

In [35]: np.unravel_index((np.abs(e - 2.2)).argmin(), e.shape)
Out[35]: (0, 1)

这里我选择2.2作为示例值。在

使用^{}可以找到最接近要搜索的元素的索引。这将输出展平向量tough的索引,但您可以使用一些基本数学找到2D:

tosearch = 2
e = np.array([[1, 2, 3], [4, 5, 6]])

idx = np.argmin(np.abs(e - tosearch))
print (idx / e.shape[1], idx % e.shape[1])

相关问题 更多 >