__contains__如何为ndarrays工作?

时间:2013-08-19 18:31:25

标签: python numpy

>>> x = numpy.array([[1, 2],
...                  [3, 4],
...                  [5, 6]])
>>> [1, 7] in x
True
>>> [1, 2] in x
True
>>> [1, 6] in x
True
>>> [2, 6] in x
True
>>> [3, 6] in x
True
>>> [2, 3] in x
False
>>> [2, 1] in x
False
>>> [1, 2, 3] in x
False
>>> [1, 3, 5] in x
False

我不知道__contains__如何适用于ndarrays。我在寻找时无法找到相关文档。它是如何工作的?它是否记录在任何地方?

3 个答案:

答案 0 :(得分:8)

我在numpy/core/src/multiarray/sequence.c找到了ndarray.__contains__的来源。作为来源国的评论,

thing in x

相当于

(x == thing).any()

对于ndarray x,无论xthing的维度如何。这仅在thing是标量时才有意义;当thing不是标量时广播的结果导致我观察到的奇怪结果,以及像array([1, 2, 3]) in array(1)这样的奇怪之处,我没有想到尝试。确切的来源是

static int
array_contains(PyArrayObject *self, PyObject *el)
{
    /* equivalent to (self == el).any() */

    PyObject *res;
    int ret;

    res = PyArray_EnsureAnyArray(PyObject_RichCompare((PyObject *)self,
                                                      el, Py_EQ));
    if (res == NULL) {
        return -1;
    }
    ret = array_any_nonzero((PyArrayObject *)res);
    Py_DECREF(res);
    return ret;
}

答案 1 :(得分:5)

似乎numpy的{​​{1}}正在为这样的二维案例做这样的事情:

__contains__

def __contains__(self, item): for row in self: if any(item_value == row_value for item_value, row_value in zip(item, row)): return True return False 有效,因为第一行的[1,7]元素与0的{​​{1}}元素匹配。与0等相同。对于[1,7],6与最后一行中的6匹配。对于[1,2],没有元素匹配同一索引处的行。 [2,6]是微不足道的,因为形状不匹配。

有关详情,请参阅this,还有this ticket

答案 2 :(得分:-1)

如何检查一维np.ndarray是否相当于二维np.ndarray中的一行

As pointed out already,

[1, 2] in x 相当于 ([1, 2] == x).any()

[1,2,3] in x 现在抛出一个 DeprecationWarning,因为它有 3 个元素长,而 x.shape[1] 只有 2 个。

如果您只想了解一个 np.ndarray 是否仅包含(以人类解释的方式)在另一个 np.ndarray 中,请使用此

>>> x = np.array([[1, 2], [3, 4], [5, 6]])
>>> np.any([np.array_equal([1, 7], el) for el in list(x)])
False
>>> np.any([np.array_equal([1, 2], el) for el in list(x)])
True