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__ndarray でどのように機能するかわかりません。検索したところ、関連するドキュメントが見つかりませんでした。それはどのように機能しますか?そして、それはどこかに文書化されていますか?

4

3 に答える 3

13

のソースを で見つけましndarray.__contains__numpy/core/src/multiarray/sequence.c。ソースのコメントにあるように、

thing in x

と同等です

(x == thing).any()

xの次元に関係なく、 ndarrayの場合。これは、 がスカラーの場合にのみ意味があります。がスカラーでない場合のブロードキャストの結果は、私が観察した奇妙な結果と、試してみようとは思わなかったような奇妙な結果を引き起こします。正確なソースはxthingthingthingarray([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

は 2 次元の場合に次のようなことをしているようnumpyです:__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一致するため、機能します。などと同じです。 では、6 は最後の行の 6 と一致します。では、同じインデックスの行に一致する要素はありません。形状が一致しないため、簡単です。0[1,7][1,2][2,6][2,3][1, 2, 3]

詳細については、こちらを参照してください。また、このチケットも参照してください。

于 2013-08-19T19:01:24.470 に答える