【问题标题】:Creating an N-dimensional grid with Python使用 Python 创建 N 维网格
【发布时间】:2017-10-28 16:05:06
【问题描述】:

我正在尝试为需要和理解距离的算法创建坐标网格。我知道如何针对已知数量的维度执行此操作 - 就像 2D 一样:

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) 并且我尝试重塑它从来没有以正确的顺序给我坐标。关于我如何干净地做到这一点的任何想法?

【问题讨论】:

  • N 是指数组的数量吗?例如,在示例情况下,您有两个数组,所以它是二维的?
  • 也许这就是你要找的东西:xarray
  • @Divakar By N - 我的意思是用户将放入一些数据矩阵,但是有多少列将是 N。所以如果他们有 8 列数据,我需要一个 8-维度网格。
  • 嘿@sharatpc。我会调查一下。谢谢!
  • 如果我做对了 - 例如xy 中的 8 列数据,假设它们保持 1D,代码保持不变,对吗?那么,有什么问题呢?

标签: python arrays numpy mesh


【解决方案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]]])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    相关资源
    最近更新 更多