23

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

最近、私はベクトルを行列のサイズに合わせてタイル張りしていますが、これは多くのメモリを使用する可能性があります。例えば

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

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

私が考えることができる他の方法は、python ループを使用することですが、ループは遅いです:

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

C拡張に頼らずにnumpyでこれを行う簡単な方法はありますか?

ブロードキャストのより柔軟なバージョンのように、ベクトルを仮想的に並べて表示できると便利です。または、操作を行単位または列単位で反復できるようにすることもできます。これは、一部の ufunc メソッドでほぼ実行できる場合があります。

4

1 に答える 1

37

すべての行に 1 次元配列を追加するために、ブロードキャストは既に処理を行っています。

mat += vec

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

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

すべての行に配列を追加する必要はありませんが、列方向の追加で同じことを行う必要があります。

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

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

于 2012-08-15T14:37:31.497 に答える