2013-08-19 37 views
15
>>> 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でどのように機能するのかわかりません。私はそれを探していたときに関連する文書を見つけることができませんでした。どのように機能するのですか?それはどこに文書化されていますか?__contains__はndarraysでどのように機能しますか?

+0

です。 – Marcin

+4

@Marcin:ソースはCの山のどこかに埋もれていて、構造を理解できません。その大部分は自動生成されていても、異なるdtypeやその他の違いを扱うために複製されています。もし私がする必要がなければ、私はすべてを掘り起こすつもりはない。 – user2357112

+3

http://www.mail-archive.com/[email protected]/msg31578.htmlに回答があるようです。 –

答えて

6

ndarray.__contains__のソースはnumpy/core/src/multiarray/sequence.cです。ソース状態のコメントとして、

thing in x 

にかかわらずxthingの寸法、ndarray xため

(x == thing).any() 

と等価です。これは、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; 
} 
5

numpy__contains__は、2次元の場合のために、このような何かをやっているように思える:最初の行の0番目の要素が[1,7]0番目の要素にマッチする

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]作品です。 [1,2]などと同じです。[2,6]では、6が最後の行の6に一致します。 [2,3]では、同じインデックスの行に一致する要素はありません。 [1, 2, 3]は形状が一致しないので自明です。

さらに詳しくはthis、またthis ticketを参照してください。

+0

「すべて」は「すべて」よりも実用的に有用であると思われますが、なぜnumpyの開発者がこの__contains__の実装を選択したのだろうと思います。 – Akavall

+1

@Akavall数値との互換性があるようです。 Numericでは、少なくとも1つの非零要素が含まれている場合、配列のブール値は「True」とみなされました。 Numpyは、 'any()'または 'all()'を使うべきであると言って、配列をブール値として使用しようとすると例外を発生させます。 この場合、 '__contains __()' APIはNumpyにブール値のコンテキストで配列を解釈させることを強制しています。そのためにNumericが行ったことをすることに決めました。 しかし、私は同意します、それは本当に混乱しています。誰かが '__contains __()'のこの振る舞いに依存するかどうかわかりません。 –

+0

互換性に関する良い点。ありがとう。 – Akavall

関連する問題