>>> 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。我在寻找时无法找到相关文档。它是如何工作的?它是否记录在任何地方?
答案 0 :(得分:8)
我在numpy/core/src/multiarray/sequence.c
找到了ndarray.__contains__
的来源。作为来源国的评论,
thing in x
相当于
(x == thing).any()
对于ndarray x
,无论x
和thing
的维度如何。这仅在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
中的一行[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