2

このリンクを使用して問題を解決しようとしましたが、numpy ブロードキャストについて説明していますが、役に立ちませんでした。次のnumpy配列を減算する方法:

X = np.array([[[1,2,3,4],[1,2,3,4],[1,2,3,4]],
              [[4,3,2,1],[4,3,2,1],[4,3,2,1]]])
X_mean = np.average(X_, axis=1)

私が行うとき、X - X_meanそれは述べています:

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

しかし、実行X[0] - X_mean[0]すると正しい出力が得られます。

array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])
4

2 に答える 2

3

実行するには、寸法を揃えておく必要がありますbroadcasting。あなたが持っている -

In [4]: whos
Variable   Type       Data/Info
-------------------------------
X          ndarray    2x3x4: 24 elems, type `int64`, 192 bytes
X_mean     ndarray    2x4: 8 elems, type `float64`, 64 bytes
  1. Axis-0ofはすでにofX_meanと連携しているので、すべて問題ありません。axis-0X

  2. Axis-1ofX_meanはofと整列されるため、そこに新しい軸を入れて、それをに戻すことができます。axis-2XX_meanNone/np.newaxisaxis-1axis-2

形状のアライメントを確認しましょう -

In [7]: X_mean3D = X_mean[:,None,:]

In [8]: whos
Variable   Type       Data/Info
-------------------------------
X          ndarray    2x3x4: 24 elems, type `int64`, 192 bytes
X_mean     ndarray    2x4: 8 elems, type `float64`, 64 bytes
X_mean3D   ndarray    2x1x4: 8 elems, type `float64`, 64 bytes

次に、ブロードキャストをもたらす減算を実行します-

In [5]: X - X_mean[:,None,:]
Out[5]: 
array([[[ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.]],

       [[ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.]]])
于 2015-12-24T06:23:18.183 に答える
0

補足として: Numpy Broadcasting Rulesによると、

2 つの配列を操作する場合、NumPy はそれらの形状を要素ごとに比較します。後続のディメンションから開始し、順方向に進みます。次の場合、2 次元は互換性があります。

  • 彼らは等しい
  • それらの1つは1です

したがって、最良のアイデアは、平均が軸 0 で作成されるようにデータを整形することです。

あなたの場合:

Y=np.rollaxis(X,1) # reshape (3,2,4)

Y-Y.mean(0)今は直接

array([[[ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.]],

       [[ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.]],

       [[ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.]]])
于 2015-12-24T09:24:50.320 に答える