20
>>> 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 是如何工作的。我在查找时找不到相关文档。它是如何工作的?它是否记录在任何地方?

4

3 回答 3

13

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

thing in x

相当于

(x == thing).any()

对于 ndarray x,无论 和 的尺寸x如何thingthing这只有在是标量时才有意义;当thing不是标量时广播的结果会导致我观察到的奇怪结果,以及array([1, 2, 3]) in array(1)我不想尝试的奇怪现象。确切的来源是

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

    int ret;
    PyObject *res, *any;

    res = PyArray_EnsureAnyArray(PyObject_RichCompare((PyObject *)self,
                                                      el, Py_EQ));
    if (res == NULL) {
        return -1;
    }
    any = PyArray_Any((PyArrayObject *)res, NPY_MAXDIMS, NULL);
    Py_DECREF(res);
    ret = PyObject_IsTrue(any);
    Py_DECREF(any);
    return ret;
}
于 2015-06-07T06:13:10.903 回答
6

似乎numpy's__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]有效,因为第一行的第 th 元素与 的第 th 元素0匹配。与etc 相同。使用6 匹配最后一行中的 6。使用时,没有任何元素与同一索引处的行匹配。是微不足道的,因为形状不匹配。0[1,7][1,2][2,6][2,3][1, 2, 3]

查看更多信息,还有这张

于 2013-08-19T19:01:24.470 回答
-1

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

正如已经指出的那样

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

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

如果您只是想知道 annp.ndarray是否(以人类解释的方式)包含在 othernp.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
于 2021-03-16T13:12:42.560 回答