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メソッドでこれを行うことができます。
すべての行に1d配列を追加するために、ブロードキャストはすでにあなたのために対処しています:
mat += vec
ただし、より一般的には、np.newaxis
を使用して、配列をブロードキャスト可能な形式に強制できます。例えば:
mat + np.ones(3)[np.newaxis,:]
すべての行に配列を追加する必要はありませんが、列ごとに追加する場合も同じようにする必要があります。
mat + np.ones(5)[:,np.newaxis]
編集:セバスチャンが言及しているように、行の追加については、mat + vec
はすでにブロードキャストを正しく処理しています。また、np.newaxis
を使用するよりも高速です。これを明確にするために元の回答を編集しました。