__getitem__ - models python
¿Cómo funciona__contains__ para ndarrays? (2)
>>> 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
No tengo idea de cómo __contains__
funciona para ndarrays. No pude encontrar la documentación relevante cuando la busqué. ¿Como funciona? ¿Y está documentado en alguna parte?
Encontré la fuente para ndarray.__contains__
, en numpy/core/src/multiarray/sequence.c
. Como comenta en los estados fuente,
thing in x
es equivalente a
(x == thing).any()
para un ndarray x
, independientemente de las dimensiones de x
y thing
. Esto solo tiene sentido cuando la thing
es un escalar; los resultados de la transmisión cuando thing
no es una causa escalar los resultados extraños que observé, así como las rarezas como array([1, 2, 3]) in array(1)
que no pensé probar. La fuente exacta es
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;
}
Parece que el numpy
de __contains__
está haciendo algo como esto para un caso de 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
[1,7]
funciona porque el elemento 0
de la primera fila coincide con el elemento 0
de [1,7]
. Lo mismo con [1,2]
etc. Con [2,6]
, los 6 coinciden con los 6 en la última fila. Con [2,3]
, ninguno de los elementos coincide con una fila en el mismo índice. [1, 2, 3]
es trivial ya que las formas no coinciden.
Mira mail-archive.com/[email protected]/msg31578.html para más, y también este boleto .