web-dev-qa-db-ja.com

numpyはベクトルによって行列のすべての行を減算します

だからn x d行列およびn x 1ベクトル。行列のすべての行をベクトルで減算するコードを作成しようとしています。

現在、forループがあり、このループは、ベクトルによってマトリックスのi-行を反復して減算します。 ベクトルで単純に行列全体を減算する方法はありますか?

ありがとう!

現在のコード:

for i in xrange( len( X1 ) ):
    X[i,:] = X1[i,:] - X2

ここがX1は、マトリックスのi-th行とX2はベクトルです。 forループを必要としないようにできますか?

42
thehandyman

これは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]])

ブロードキャスト軸のルールは、詳細に説明されています ここ

56
John1024

@ 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]])
10
Nagasaki45