len __getitem__ __eq__ __dict__ python numpy

__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 .