首页 > 解决方案 > numpy 测试是否在另一个数组的行中的每个值

问题描述

我有两个相同形状的数组(2500、9)。我试图找出最有效的方法来测试一行中的每个值array1是否在array2. 考虑以下简化示例:

>>> array1 = np.array([[1, 2, 3], [4, 5, 6], [3, 8, 9]])
>>> array2 = np.array([[0, 2, 4], [3, 5, 6], [6, 8, 9]])
>>> comparison_func(array1, array2)
array([False, True, False], 
      [False, True, True], 
      [False, True, True])

我可以通过遍历 in 中的每个值array1并测试该值是否在array2.

>>> comp = []
>>> rows, columns = array1.shape
>>> np.array([array1[row, column] in array2[row, :]
              for row in range(rows)
              for column in range(columns)])
      .reshape(array1.shape)
array([[False,  True, False],
       [False,  True,  True],
       [False,  True,  True]])

我想知道在numpy中是否有更有效的方法来做到这一点。np.isin我尝试了和的各种组合np.isin1d,但无法将比较限制为从array1到 中相应行的标量array2。在此先感谢您的任何建议。

标签: pythonnumpynumpy-ndarray

解决方案


Numpy 是==平等的:

>>> array1 = np.array([[1, 2, 3], [4, 5, 6], [3, 8, 9]])
>>> array2 = np.array([[0, 2, 4], [3, 5, 6], [6, 8, 9]])
>>> print(array1 == array2)
[[False  True False]
 [False  True  True]
 [False  True  True]]
>>>

Numpy 这样做的方式是他们将__eq__函数更改为其他内容,即执行上述操作。

这是一个示例,说明如何在 python 类中实现这一点:

class array:
    def __init__(self, lst):
        self.lst = lst
    def __eq__(self, other):
        self.final = [[other[i][x] == y for x, y in enumerate(v)] for i, v in enumerate(self.lst)]
        return self.final
print(array([[1, 2, 3], [4, 5, 6], [3, 8, 9]]) == [[0, 2, 4], [3, 5, 6], [6, 8, 9]])

输出:

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

推荐阅读