numpy 2D数组之间的广播行成员资格

tyg4sfes  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(94)

假设我们有以下二维数组:

>>> A
array([[1, 1],
       [2, 2],
       [3, 1]])

>>> B
array([[2, 1],
       [1, 2],
       [3, 1],
       [4, 2]])

我想测试A的行在B的行中的成员关系。对于A的单行,我们可以使用以下公式测试它在B中的成员关系:

np.any(np.all(A[index] == B, axis=1))

我想一次对A的所有行执行此操作,而不循环遍历索引。结果应该是:

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

我们如何以广播的方式检索这个结果(而不循环遍历A的行)?

fnvucqvd

fnvucqvd1#

正如您所猜测的那样,您可以使用广播以矢量化的方式将A的每一行与B的每一行进行比较:

out = (A == B[:, None]).all(axis=-1).any(axis=0)

>>> out
array([False, False,  True])
说明

为了更好地理解这是如何工作的,让我们使用一个修改过的问题:

A = np.array([
    [4, 2],
    [1, 1],
    [2, 2],
    [3, 1]])

B = np.array([
    [2, 1],
    [4, 2],
    [1, 2],
    [3, 1],
    [4, 2]])

其中,我们期望在B中的第1行和第4行找到A[0][4, 2])。然后:

>>> (A == B[:, None]).all(axis=-1)
array([[False, False, False, False],
       [ True, False, False, False],
       [False, False, False, False],
       [False, False, False,  True],
       [ True, False, False, False]])

显示A[0] == B[1]A[0] == B[4](第一列),以及A[3] == B[3](最后一列)。
此时,只有.any(axis=0)完成作业以产生所需的结果。

相关问题