规则间距的三维点阵
我想创建一个列表,里面包含一组规则间隔的三维坐标点,每个坐标点用三个元素组成的元组表示。我在寻找最有效的方法来实现这个目标。
比如在C++中,我会用三个嵌套的循环,分别处理每个坐标。在Matlab中,我可能会使用meshgrid函数,这样可以用一个命令就搞定。我在Python中了解过meshgrid和mgrid,也听说过使用numpy的广播规则会更高效。看起来结合zip函数和numpy的广播规则可能是最有效的方式,但我发现zip在numpy中似乎没有被重载。
5 个回答
2
我建议你使用 meshgrid
或 mgrid
,特别是当你需要非整数坐标的时候。我有点惊讶,Numpy 的广播规则会更高效,因为 meshgrid
是专门为你想解决的问题设计的。
4
你可以用ogird来代替meshgrid和mgrid,ogird是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]])
4
使用 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)