2017-10-28 125 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'你的意思數量數組?例如,在示例中,您有兩個數組,因此它是二維的? – Divakar

+0

也許這就是你要找的東西:[xarray](http://xarray.pydata.org/en/stable/) – skrubber

+0

@Divakar By N - 我的意思是一個用戶打算放入一些數據矩陣,但是很多列將會是N.所以如果他們有8列數據,我需要一個8維網格。 – Zach

回答

1

我可以複製你的z

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]]]) 

的瓦件看起來像

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和以上。但我沒有完全處理你的意圖。

可能簡單(repeattile更快):

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

隨着越來越多維度transpose可能需要細化。


meshgrid(它可能使用repeattile內部同樣的事情:

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