2017-10-28 100 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