用对应于另一个二维数组的索引替换二维数组的值

Replace values of 2-D array by indices of corresponding to another 2-D array

我是numpy的新手。我有一个大小为 6 x 2 的数组 A 和一个大小为 4 x 2 的数组 B。结果我想要一个数组 C 填充了 B 的索引 i.

这是输入和输出的示例:

A = [[ 240.  240.][   0.  480.][   0.  960.][   0.  480.][   0.  720. ][   0.  480.]]
B = [[   0.  480.][   0.  720.][   0.  960.][ 240.  240.]]

C = [3, 0, 2, 0, 1, 0]

我尝试使用 np.searchsorted() 但只接受一维数组 我没有找到如何做到这一点的方法。请给我建议。谢谢。

假设一定要匹配,可以使用:

np.isclose(abs(B-A[:, None]), 0).all(2).argmax(1)

输出:

array([3, 0, 2, 0, 1, 0])

工作原理

这会计算 element-wise A 和 B 之间的绝对差值,然后转换为布尔值以识别接近 0 的值。如果全部为 True,我们将 argmax 的索引识别为 True > False

中间体

abs(B-A[:, None])

array([[[240., 240.],
        [240., 480.],
        [240., 720.],
        [  0.,   0.]],

       [[  0.,   0.],
        [  0., 240.],
        [  0., 480.],
        [240., 240.]],

       [[  0., 480.],
        [  0., 240.],
        [  0.,   0.],
        [240., 720.]],

       [[  0.,   0.],
        [  0., 240.],
        [  0., 480.],
        [240., 240.]],

       [[  0., 240.],
        [  0.,   0.],
        [  0., 240.],
        [240., 480.]],

       [[  0.,   0.],
        [  0., 240.],
        [  0., 480.],
        [240., 240.]]])

np.isclose(abs(B-A[:, None]), 0)

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

       [[ True,  True],
        [ True, False],
        [ True, False],
        [False, False]],

       [[ True, False],
        [ True, False],
        [ True,  True],
        [False, False]],

       [[ True,  True],
        [ True, False],
        [ True, False],
        [False, False]],

       [[ True, False],
        [ True,  True],
        [ True, False],
        [False, False]],

       [[ True,  True],
        [ True, False],
        [ True, False],
        [False, False]]])


np.isclose(abs(B-A[:, None]), 0).all(2)

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