web-dev-qa-db-ja.com

numpyの行列行にベクトルを追加する

Numpyで行列のすべての行または列にベクトルを追加する高速な方法はありますか?.

最近、私はベクトルを行列のサイズにタイリングしており、これは大量のメモリを使用する可能性があります。例えば

    mat=np.arange(15)
    mat.shape=(5,3)

    vec=np.ones(3)
    mat+=np.tile(vec, (5,1))

私が考えることができるもう1つの方法は、pythonループを使用することですが、ループは低速です。

    for i in xrange(len(mat)):
        mat[i,:]+=vec

Cの拡張機能に頼ることなく、これを簡単にすばやく行う方法はありますか?

放送のより柔軟なバージョンのように、ベクトルを仮想的に並べることができればいいでしょう。または、行単位または列単位で操作を反復できるようにするために、一部のufuncメソッドでこれを行うことができます。

20
user1149913

すべての行に1d配列を追加するために、ブロードキャストはすでにあなたのために対処しています:

mat += vec

ただし、より一般的には、np.newaxisを使用して、配列をブロードキャスト可能な形式に強制できます。例えば:

mat + np.ones(3)[np.newaxis,:]

すべての行に配列を追加する必要はありませんが、列ごとに追加する場合も同じようにする必要があります。

mat + np.ones(5)[:,np.newaxis]

編集:セバスチャンが言及しているように、行の追加については、mat + vecはすでにブロードキャストを正しく処理しています。また、np.newaxisを使用するよりも高速です。これを明確にするために元の回答を編集しました。

25
JoshAdel