だからn x d
行列およびn x 1
ベクトル。行列のすべての行をベクトルで減算するコードを作成しようとしています。
現在、for
ループがあり、このループは、ベクトルによってマトリックスのi
-行を反復して減算します。 ベクトルで単純に行列全体を減算する方法はありますか?
ありがとう!
現在のコード:
for i in xrange( len( X1 ) ):
X[i,:] = X1[i,:] - X2
ここがX1
は、マトリックスのi
-th行とX2
はベクトルです。 for
ループを必要としないようにできますか?
これはnumpy
で機能しますが、後続の軸が同じ次元である場合のみです。マトリックスからベクトルを正常に減算する例を次に示します。
In [27]: print m; m.shape
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
Out[27]: (4, 3)
In [28]: print v; v.shape
[0 1 2]
Out[28]: (3,)
In [29]: m - v
Out[29]:
array([[0, 0, 0],
[3, 3, 3],
[6, 6, 6],
[9, 9, 9]])
これは、両方の後縁軸の寸法が同じであるために機能しました(3)。
あなたの場合、主要な軸は同じ次元でした。上記と同じv
を使用した、修正方法の例を次に示します。
In [35]: print m; m.shape
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
Out[35]: (3, 4)
In [36]: (m.transpose() - v).transpose()
Out[36]:
array([[0, 1, 2, 3],
[3, 4, 5, 6],
[6, 7, 8, 9]])
ブロードキャスト軸のルールは、詳細に説明されています ここ 。
@ John1024の答えに加えて、numpyで1次元のベクトルを「転置」するには、次のようにします。
In [1]: v = np.arange(3)
In [2]: v
Out[2]: array([0, 1, 2])
In [3]: v = v[:, np.newaxis]
In [4]: v
Out[4]:
array([[0],
[1],
[2]])
ここから、v
のすべての列からm
を引くことは、ブロードキャストを使用して簡単にできます。
In [5]: print(m)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
In [6]: m - v
Out[6]:
array([[0, 1, 2, 3],
[3, 4, 5, 6],
[6, 7, 8, 9]])