具有规则间隔点的三维网格

时间:2010-03-25 19:29:20

标签: python numpy

我想创建一个列表,其中包含规则间隔点网格的三维坐标,每个点都是一个3元素元组。我正在寻找有关最有效方法的建议。

例如,在C ++中,我只是循环遍历三个嵌套循环,每个坐标一个循环。在Matlab中,我可能会使用meshgrid函数(可以在一个命令中执行)。我在Python中读到了关于meshgrid和mgrid的内容,我还读到使用numpy的广播规则更有效。在我看来,使用zip函数结合numpy广播规则可能是最有效的方式,但zip似乎没有在numpy超载。

5 个答案:

答案 0 :(得分:3)

使用ndindex

import numpy as np
ind=np.ndindex(3,3,2)
for i in ind:
    print(i)

# (0, 0, 0)
# (0, 0, 1)
# (0, 1, 0)
# (0, 1, 1)
# (0, 2, 0)
# (0, 2, 1)
# (1, 0, 0)
# (1, 0, 1)
# (1, 1, 0)
# (1, 1, 1)
# (1, 2, 0)
# (1, 2, 1)
# (2, 0, 0)
# (2, 0, 1)
# (2, 1, 0)
# (2, 1, 1)
# (2, 2, 0)
# (2, 2, 1)

答案 1 :(得分:3)

您可以使用ogrid代替meshgrid和mgrid,这是mgrid的“稀疏”版本。也就是说,只填充值变化的维度。其他的只是广播。与非稀疏替代方案相比,这对大型网格使用的内存要少得多。

例如:

>>> import numpy as np
>>> x, y = np.ogrid[-1:2, -2:3]
>>> x
array([[-1],
      [ 0],
      [ 1]])
>>> y
array([[-2, -1,  0,  1,  2]])
>>> x**2 + y**2
array([[5, 2, 1, 2, 5],
      [4, 1, 0, 1, 4],
      [5, 2, 1, 2, 5]])

答案 2 :(得分:1)

对于multi-d(大于2个)网格,使用numpy.lib.index_tricks.nd_grid,如下所示:

import numpy
grid = numpy.lib.index_tricks.nd_grid()
g1 = grid[:3,:3,:3]
g2 = grid[0:1:0.5, 0:1, 0:2]
g3 = grid[0:1:3j, 0:1:2j, 0:2:2j]

其中g1的x值为[0,1,2] 和g2的x值为[0,.5], 和g3的x值为[0.0,0.5,1.0](3j定义步数而不是步进增量。有关详细信息,请参阅documentation

答案 3 :(得分:1)

我会说meshgridmgrid,特别是如果您需要非整数坐标。我很惊讶Numpy的广播规则会更有效率,因为meshgrid是专为您想要解决的问题而设计的。

答案 4 :(得分:0)

这是一个类似于您的C ++解决方案的有效选项,我将其用于完全相同的目的:

import numpy, itertools, collections
def grid(xmin, xmax, xstep, ymin, ymax, ystep, zmin, zmax, zstep):
    "return nested tuples of grid-sampled coordinates that include maxima"
    return collections.deque( itertools.product( 
        numpy.arange(xmin, xmax+xstep, xstep).tolist(),
        numpy.arange(ymin, ymax+ystep, ystep).tolist(),
        numpy.arange(zmin, zmax+zstep, zstep).tolist() ) )

使用a.tolist()时,性能最好(在我的测试中),如上所示,但你可以使用a.flat代替并删除deque()来获取一个会吸收内存的迭代器。当然,您也可以使用普通的旧元组()或list()而不是deque()来获得轻微的性能损失(同样,在我的测试中)。