Question Comment __contains__ fonctionne-t-il pour ndarrays?


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

Je n'ai aucune idée de comment __contains__ travaille pour ndarrays. Je n'ai pas pu trouver la documentation pertinente lorsque je l'ai recherchée. Comment ça marche? Et est-ce documenté n'importe où?


16
2017-08-19 18:31


origine


Réponses:


J'ai trouvé la source pour ndarray.__contains__, dans numpy/core/src/multiarray/sequence.c. Comme un commentaire dans les états sources,

thing in x

est équivalent à

(x == thing).any()

pour un ndarray x, indépendamment des dimensions de x et thing. Cela n'a de sens que lorsque thing est un scalaire; les résultats de la diffusion lorsque thing n'est pas un scalaire causer les résultats étranges que j'ai observés, ainsi que des bizarreries comme array([1, 2, 3]) in array(1) que je n'ai pas pensé essayer. La source exacte est

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;
}

7
2018-06-07 06:13



Semble être numpy's __contains__ fait quelque chose comme ça pour un cas de deux jours:

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] fonctionne parce que le 0l'élément de la première rangée correspond à la 0élément de [1,7]. Même avec [1,2] etc. avec [2,6], le 6 correspond au 6 dans la dernière ligne. Avec [2,3], aucun des éléments ne correspond à une ligne du même index. [1, 2, 3] est trivial puisque les formes ne correspondent pas.

Voir ce pour plus, et aussi ce billet.


5
2017-08-19 19:01