根据具有不匹配尺寸的2d数组中的最接近值来定位numpy指数

时间:2018-03-09 15:49:36

标签: python numpy

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

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

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

array([1, 0])

非常感谢!

3 个答案:

答案 0 :(得分:3)

通常您会使用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]

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

但是,您提供的输入不是标准数字数组,而是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作为示例值。

答案 1 :(得分:0)

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

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)

答案 2 :(得分:0)

使用argmin,您可以找到最接近您要搜索的元素的索引。这将输出变平矢量的索引,但你可以找到带有一些基本数学的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])