将二维数组的值替换为另一个二维数组对应的索引



我是numpy新手。我有一个大小为6 × 2的数组A和一个大小为4 × 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(),但只接受1d数组我没有找到做这件事的方法。请给我一些建议。谢谢你。

假设有必要匹配,您可以使用:

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

输出:

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

工作原理

按元素计算A和B之间的绝对差值,然后转换为布尔值以标识接近0的值。如果全部为True,则将argmax的索引识别为True>假

中间体

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