__contains__如何为ndarrays工作?

use*_*ica 16 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
Run Code Online (Sandbox Code Playgroud)

我不知道__contains__ndarrays是如何工作的.我找的时候找不到相关的文档.它是如何工作的?它是否记录在任何地方?

use*_*ica 8

我发现源ndarray.__contains__numpy/core/src/multiarray/sequence.c.作为来源国的评论,

thing in x
Run Code Online (Sandbox Code Playgroud)

相当于

(x == thing).any()
Run Code Online (Sandbox Code Playgroud)

用于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;
}
Run Code Online (Sandbox Code Playgroud)


Alo*_*hal 5

好像numpy__contains__是做这样的事情对于一个2-d的情况下:

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
Run Code Online (Sandbox Code Playgroud)

[1,7]因为0第一行的0第th个元素匹配第th个元素,因此可以正常工作[1,7].与[1,2]等相同[2,6],6匹配最后一行中的6.使用时[2,3],没有元素匹配同一索引处的行.[1, 2, 3]因为形状不匹配所以是微不足道的.

请参阅此内容以获取更多信息以及此故障单.