2017-10-28 14 views
-1

私は、距離を必要とし、理解しているアルゴリズムの座標グリッドを作成しようとしています。私は2Dのように既知の次元数でこれを行う方法を知っています。PythonでN次元グリッドを作成する

x = [0,1,2] 
y = [10,11,12] 


z = np.zeros((3,3,2)) 
for i,X in enumerate(x): 
    for j,Y in enumerate(y): 
     z[i][j][0] = X 
     z[i][j][1] = Y 
print(z) 
-------------------------- 
array([[[ 0., 10.], 
     [ 0., 11.], 
     [ 0., 12.]], 

     [[ 1., 10.], 
     [ 1., 11.], 
     [ 1., 12.]], 

     [[ 2., 10.], 
     [ 2., 11.], 
     [ 2., 12.]]]) 

これは十分に機能します。私は(3,3,2)の形になります。ここで2はその点の座標の値です。私はこれを使って確率面を作成しようとしているので、それぞれの点を自分自身の「位置」値にする必要があります。これをN次元に簡単に拡張する方法はありますか?そこでは、forループの数は不明です。プロジェクトの制約のため、私はPythonの組み込み関数とnumpyにアクセスできますが、多かれ少なかれです。

私はnp.meshgrid()を試しましたが、出力シェイプが(2,3,3)になりました。それを再形成しようとすると正しい順序で座標が返されませんでした。どのように私はこれをきれいに行うことができるかについてのアイデア?

+0

N ' 'ことで、あなたが数を意味しています配列?例えば、2つの配列を持つサンプルの場合、それは2次元ですか? – Divakar

+0

多分これはあなたが探しているものです:[xarray](http://xarray.pydata.org/en/stable/) – skrubber

+0

@Divakar By N - 私はユーザーがデータのいくつかの行列を入れようとしていることを意味し、 8列のデータがある場合は、8次元のグリッドが必要です。 – Zach

答えて

1

私は

In [223]: np.stack([np.tile([x],(1,3)).reshape(3,3).T,np.tile([y],(3,1))],2) 
Out[223]: 
array([[[ 0, 10], 
     [ 0, 11], 
     [ 0, 12]], 

     [[ 1, 10], 
     [ 1, 11], 
     [ 1, 12]], 

     [[ 2, 10], 
     [ 2, 11], 
     [ 2, 12]]]) 

であなたのzを複製することができますタイル片が、私は第二1をクリーンアップすることができるかもしれません

In [224]: np.tile([y],(3,1)) 
Out[224]: 
array([[10, 11, 12], 
     [10, 11, 12], 
     [10, 11, 12]]) 
In [225]: np.tile([x],(1,3)).reshape(3,3).T 
Out[225]: 
array([[0, 0, 0], 
     [1, 1, 1], 
     [2, 2, 2]]) 

のように見えます。しかし、基本的な考え方は、入力をstackが望ましい(n,n,2)配列に結合できるように入力を複製することです。

これが理解されたら、物事を3d以上に拡張することは難しくありません。しかし、私はあなたの意図を完全には処理していません。

tileよりも高速であるとrepeat)おそらく単純:transposeは洗練を必要とするかもしれない複数の次元で

np.stack([np.repeat(x,3).reshape(3,3), np.repeat(y,3).reshape(3,3).T], 2) 

meshgrid


同じこと(それはおそらく内部repeatまたはtileを使用しています:高次元で

In [232]: np.stack(np.meshgrid(x,y, indexing='ij'),2) 
Out[232]: 
array([[[ 0, 10], 
     [ 0, 11], 
     [ 0, 12]], 

     [[ 1, 10], 
     [ 1, 11], 
     [ 1, 12]], 

     [[ 2, 10], 
     [ 2, 11], 
     [ 2, 12]]]) 

を:

In [237]: np.stack(np.meshgrid([1,2], [10,20,30], [100,200,300,400], indexing='ij'), 3).sum(axis=-1) 
Out[237]: 
array([[[111, 211, 311, 411], 
     [121, 221, 321, 421], 
     [131, 231, 331, 431]], 

     [[112, 212, 312, 412], 
     [122, 222, 322, 422], 
     [132, 232, 332, 432]]]) 
+0

正確に私が必要なもの、ありがとう! – Zach

関連する問題