9

たとえば、これらの結果を理解しようとすると、次のようになります。

>>> x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> (x == np.array([[1],[2]])).astype(np.float32)
array([[ 0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]], dtype=float32)
>>> (x == np.array([1,2]))
   False
>>> (x == np.array([[1]])).astype(np.float32)
array([[ 0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]], dtype=float32)
>>> (x == np.array([1])).astype(np.float32)
array([ 0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.], dtype=float32)

>>> (x == np.array([[1,3],[2]]))
False
>>> 

何が起きてる?[1] の場合、1 を x の各要素と比較し、結果を配列に集計しています。[[1]]の場合も同様です。repl で実験するだけで、特定の配列形状で何が起こるかを簡単に把握できます。しかし、両側が任意の形状を持つことができる基本的なルールは何ですか?

4

3 に答える 3

6

NumPy は、比較する前に 2 つの配列を互換性のある形状にブロードキャストしようとします。ブロードキャストが失敗した場合、現在 False が返されます。今後

ブロードキャストや要素の比較などが失敗した場合、等値演算子==は将来 np.equal のようなエラーを発生させます。

それ以外の場合は、要素ごとの比較の結果のブール配列が返されます。たとえば、xnp.array([1])はブロードキャスト可能であるため、形状 (10,) の配列が返されます。

In [49]: np.broadcast(x, np.array([1])).shape
Out[49]: (10,)

xnp.array([[1,3],[2]])はブロードキャスト可能ではないため、Falseによって返されx == np.array([[1,3],[2]])ます。

In [50]: np.broadcast(x, np.array([[1,3],[2]])).shape
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-50-56e4868cd7f7> in <module>()
----> 1 np.broadcast(x, np.array([[1,3],[2]])).shape

ValueError: shape mismatch: objects cannot be broadcast to a single shape
于 2016-02-14T20:54:22.353 に答える
3

あなたを混乱させているのは、次のことである可能性があります。

  1. 一部放送中です。

  2. あなたはnumpyの古いバージョンを持っているようです。


x == np.array([[1],[2]])

放送中です。xこれは、1 番目と 2 番目の配列のそれぞれと比較されます。それらはスカラーであるため、ブロードキャストは、の各要素をx各スカラーと比較することを意味します。


ただし、それぞれの

x == np.array([1,2])

x == np.array([[1,3],[2]])

放送できません。私は、numpy1.10.4で、これにより

/usr/local/bin/ipython:1: DeprecationWarning: elementwise == comparison failed; this will raise an error in the future.
#!/usr/bin/python
False
于 2016-02-14T20:55:57.303 に答える