tropicbirdのブログ

備忘録です。

Python備忘録(1)

ブロードキャストの方向。

・NumPyのブロードキャストは基本行方向

In [61]: A=np.random.randint(10,size=(3,4))

In [62]: A
Out[62]:
array([[2, 0, 2, 6],
 [6, 9, 1, 0],
 [5, 9, 4, 3]])

In [63]: A[0]
Out[63]: array([2, 0, 2, 6])

In [64]: A-A[0]
Out[64]:
array([[ 0,  0,  0,  0],
 [ 4,  9, -1, -6],
 [ 3,  9,  2, -3]])


・NumPyのブロードキャストを列方向で行う時の注意点

In [65]: A[:,0]
Out[65]: array([2, 6, 5])

In [66]: A-A[:,0]
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-66-8be286d6b379> in <module>
----> 1 A-A[:,0]

ValueError: operands could not be broadcast together with shapes (3,4) (3,)

#エラーになるのは、A[:,0]の構造が(3,)のため
In [69]: A[:,0].shape
Out[69]: (3,)


#構造を(3,1)とすればよい。
In [67]: A[:,0].reshape((3,1))
Out[67]:
array([[2],
       [6],
       [5]])

#や、
In [68]: np.reshape(A[:,0],(3,1))
Out[68]:
array([[2],
       [6],
       [5]])

#そうすると、列方向のブロードキャストが可能となる。
In [71]: A-A[:,0].reshape((3,1))
Out[71]:
array([[ 0, -2,  0,  4],
       [ 0,  3, -5, -6],
       [ 0,  4, -1, -2]])

・ポイント:(m,n)と(m,1)はブロードキャストできるが、(m,n)と(m,)はできない。

・参考にしたURL
stackoverflow.com