Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 由规则间隔的点组成的三维网格_Python_Numpy - Fatal编程技术网

Python 由规则间隔的点组成的三维网格

Python 由规则间隔的点组成的三维网格,python,numpy,Python,Numpy,我想创建一个包含规则间隔点网格的三维坐标的列表,每个点作为一个3元素元组。我正在寻找最有效的方法来做这件事的建议 在C++中,我只需循环三个嵌套循环,每个坐标循环一个。在Matlab中,我可能会使用meshgrid函数(它可以在一个命令中完成)。我读过Python中的meshgrid和mgrid,还读到使用numpy的广播规则更有效。在我看来,将zip函数与numpy广播规则结合使用可能是最有效的方法,但在numpy中zip似乎没有过载 使用ndix: import numpy as np in

我想创建一个包含规则间隔点网格的三维坐标的列表,每个点作为一个3元素元组。我正在寻找最有效的方法来做这件事的建议


在C++中,我只需循环三个嵌套循环,每个坐标循环一个。在Matlab中,我可能会使用meshgrid函数(它可以在一个命令中完成)。我读过Python中的meshgrid和mgrid,还读到使用numpy的广播规则更有效。在我看来,将zip函数与numpy广播规则结合使用可能是最有效的方法,但在numpy中zip似乎没有过载

使用
ndix

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)
对于多维(大于2)网格,请使用
numpy.lib.index\u tricks.nd\u 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定义步长计数而不是步长增量。有关更多详细信息,请参阅。

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

您可以使用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]])

这是一个类似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() ) )

(在我的测试中)使用.tolist()时性能最好,如上所示,但您可以使用.flat代替,并删除deque()以获得将占用内存的迭代器。当然,您也可以使用普通的旧tuple()或list()代替deque(),以获得轻微的性能损失(同样,在我的测试中).

您也可以只使用numpy.mgrid,它只是numpy.lib.index\u tricks.nd\u grid的一个实例。广播可以大大减少用于大型网格的内存。有关更多信息,请参阅我关于使用
ogrid
的回答。@rephorm:确实(+1)供您评论。我在过去两年中确实了解到了这一点。:)