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