web-dev-qa-db-ja.com

Numpy-ベクトルの行で行列を作成します

私はベクトルを持っています[x,y,z,q]そして私はマトリックスを作成したい:

[[x,y,z,q],
 [x,y,z,q],
 [x,y,z,q],
...
 [x,y,z,q]]

m行あり。これは、ブロードキャストを使用して何らかのスマートな方法で実行できると思いますが、forループを使用して実行することしか考えられません。

9
fulaphex

確かに可能です broadcasting 列に沿ってmゼロを追加した後、次のように-

np.zeros((m,1),dtype=vector.dtype) + vector

現在、NumPyにはすでに組み込み関数があります np.tile まったく同じタスク用-

np.tile(vector,(m,1))

サンプル実行-

In [496]: vector
Out[496]: array([4, 5, 8, 2])

In [497]: m = 5

In [498]: np.zeros((m,1),dtype=vector.dtype) + vector
Out[498]: 
array([[4, 5, 8, 2],
       [4, 5, 8, 2],
       [4, 5, 8, 2],
       [4, 5, 8, 2],
       [4, 5, 8, 2]])

In [499]: np.tile(vector,(m,1))
Out[499]: 
array([[4, 5, 8, 2],
       [4, 5, 8, 2],
       [4, 5, 8, 2],
       [4, 5, 8, 2],
       [4, 5, 8, 2]])

同じ効果を得るために、次元をnp.repeatで拡張した後、 np.newaxis/None を使用することもできます。

In [510]: np.repeat(vector[None],m,axis=0)
Out[510]: 
array([[4, 5, 8, 2],
       [4, 5, 8, 2],
       [4, 5, 8, 2],
       [4, 5, 8, 2],
       [4, 5, 8, 2]])

integer array indexing を使用して、次のようにレプリケーションを取得することもできます-

In [525]: vector[None][np.zeros(m,dtype=int)]
Out[525]: 
array([[4, 5, 8, 2],
       [4, 5, 8, 2],
       [4, 5, 8, 2],
       [4, 5, 8, 2],
       [4, 5, 8, 2]])

そして最後に np.broadcast_to を使用すると、入力vector2Dビューを作成するだけで、実質的に無料で、追加のメモリ要件はありません。 。だから、私たちは単にするでしょう-

In [22]: np.broadcast_to(vector,(m,len(vector)))
Out[22]: 
array([[4, 5, 8, 2],
       [4, 5, 8, 2],
       [4, 5, 8, 2],
       [4, 5, 8, 2],
       [4, 5, 8, 2]])

ランタイムテスト-

これは、さまざまなアプローチを比較する簡単なランタイムテストです-

In [12]: vector = np.random.Rand(10000)

In [13]: m = 10000

In [14]: %timeit np.broadcast_to(vector,(m,len(vector)))
100000 loops, best of 3: 3.4 µs per loop # virtually free!

In [15]: %timeit np.zeros((m,1),dtype=vector.dtype) + vector
10 loops, best of 3: 95.1 ms per loop

In [16]: %timeit np.tile(vector,(m,1))
10 loops, best of 3: 89.7 ms per loop

In [17]: %timeit np.repeat(vector[None],m,axis=0)
10 loops, best of 3: 86.2 ms per loop

In [18]: %timeit vector[None][np.zeros(m,dtype=int)]
10 loops, best of 3: 89.8 ms per loop
11
Divakar