如何使用Numpy在使用另一个列表作为参考的矩阵中查找索引?

oxiaedzo  于 2022-11-24  发布在  其他
关注(0)|答案(2)|浏览(143)

设A为矩阵:

A = array([[0.        , 0.        , 0.        , ..., 0.        , 0.        ,
    0.        ],
   [0.        , 0.28867513, 0.28867513, ..., 0.        , 0.        ,
    0.        ],
   [0.        , 0.        , 0.        , ..., 0.        , 0.        ,
    0.        ],
   [0.        , 0.        , 0.        , ..., 0.        , 0.        ,
    0.        ],
   [0.        , 0.13363062, 0.13363062, ..., 0.        , 0.        ,
    0.        ]])

B = array([0.70710678, 0.66666667, 0.5       , 0.75      , 1.        ])

我需要找到B在A中的索引。
预期输出:

Matrix containing position of elements.

我想使用内置的numpy命令/逻辑来执行这个操作,而不是使用列表理解或for循环。
更新:已尝试使用isin,无法处理同一行中具有相同值的多个元素。
更新了一个更好的问题示例。

shyt4zoc

shyt4zoc1#

numpy.all有一个axis输入,因此您可以检查行/列是否全部为True。

np.where(np.all(A==B, axis=1))
cczfrluj

cczfrluj2#

用你原来的例子

In [436]: A = [[0, 1, 2, 3],
     ...:      [4, 5, 6, 7],
     ...:      [8, 9, 10, 11]]
     ...: 
     ...: B = [2, 5, 11]

一个简单的列表解析产生:

In [437]: [a.index(b) for a,b in zip(A,B)]
Out[437]: [2, 1, 3]

index只给出第一个值,如果不匹配就会产生一个错误。我们可以写一个cover函数来解决这个问题,捕捉错误,然后重复它自己。
如果输入为数组:

In [438]: AA = np.array(A); BB = np.array(B)

我们可以做一个"行式"测试:

In [439]: BB[:,None]==AA
Out[439]: 
array([[False, False,  True, False],
       [False,  True, False, False],
       [False, False, False,  True]])

并找出所有的真值。你的[2,1,3]是第二个数组。

In [440]: np.nonzero(_)
Out[440]: (array([0, 1, 2], dtype=int64), array([2, 1, 3], dtype=int64))

匹配也不是那么干净,每行的匹配数是可变的。
如果值是浮点数,我们可以使用isclose

In [441]: np.isclose(BB[:,None],AA)
Out[441]: 
array([[False, False,  True, False],
       [False,  True, False, False],
       [False, False, False,  True]])

Get all indexes of multiple values in numpy array
在两个数组之间寻找多个匹配项。两个数组都是一维的,但是响应说明了处理多个匹配项的复杂性。

相关问题