2017-05-23 4 views
2

用せずに座標のセットの周りに乱数を発生:I座標手段(3D)、このようにそれらをaccompying標準偏差(3D)の組の集合を有するループ

means = [[x1, y1, z1], 
     [x2, y2, z2], 
     ... 
     [xn, yn, zn]] 

stds = [[sx1, sy1, sz1], 
     [sx2, sy2, sz2], 
     ... 
     [sxn, syn, szn]] 

ので問題はNでありますx 3

np.random.normal()を使用して1000個の座標サンプルセット(N x 3 x 1000)をランダムに生成したいと考えています。現在、私は、forループを使用してサンプルを生成します。

for i in range(0,1000): 
    samples = np.random.normal(means, stds) 

をしかし、私は、私はforループを失い、numpyのが速く、1回の呼び出しでそれをやらせることができます感を持って、誰もが、私はそれをコーディングする方法を知っていますか?

答えて

4

または代わりsize引数を使用します。

import numpy as np 

means = [ [0, 0, 0], [1, 1, 1] ] 
std = [ [1, 1, 1], [1, 1, 1] ] 

#100 samples 
print(np.random.normal(means, std, size = (100, len(means), 3))) 
+0

をあなたはサイズ引数は正確にどのように機能するかについてコメントすることができますか?たぶん私は愚かですが、私はドキュメントが少し曖昧だと思います。 '配列サンプル'の数は最初のタプルメンバーで、配列の次元は後者の2つですか? – TheCat

+0

@TheCatはい、サンプルの数が最初の引数なので、結果の形状は '1000、N、3'になります。 Numpyは2つのオブジェクトを1つの「余分な次元がある」、すなわち '(2,3)'が '(2,2,3)'に対してブロードキャストされ、 '(2、 3,2) '。 – ewcz

+0

numpyは '(N、3)'という形のオブジェクトを1000回生成し、それらを一緒に付加すると、結果の形状は '(1000、N、3)' ... – ewcz

0

meansstdsの配列を1000回繰り返してから、np.random.normal()を1回呼び出すことができます。

means = [[0, 0, 0], 
     [1, 1, 1]] 

stds = [[1, 1, 1], 
     [2, 2, 2]] 

means = numpy.array(means) * numpy.ones(1000)[:, None, None] 
stds = numpy.array(stds) * numpy.ones(1000)[:, None, None] 

samples = numpy.random.normal(means, stds)