如何使用Python获取n维立方体中所有整数点的列表?

3

假设有一个立方体,坐标从(-x,-x,-x,...)到(+y,+y,+y,...),其中 x,y>0,如何使用简短易懂的代码获取所有整数列表?

目前为止,我的代码是:

list((x,y,z) for x in range(-x,y) for y in range(-x,y) for z in range(-x,y))
# has the dimension hardcoded

list(itertools.product(*[np.arange(-x, y)]*dim))
# difficult to understand what is going on

有更直观的解决方案吗?
2个回答

5

你的第二个解决方案看起来非常好,尽管我会这样做:

list(itertools.product(range(-x, y), repeat=dim))

1

只需将您的“硬编码”版本封装在一个函数中,并将尺寸作为参数传递

def cube_points(x1, x2, y1, y2, z1, z2): #This describes any rectangular prism
    return [(x,y,z) for x in range(x1, x2+1) for y in range(y1, y2+1) for z in range(z1, z2+1)]

这里的 x1x2 是将立方体投影到 x 轴上形成的线段的端点,等等。

编辑:对于一个 n 维立方体。

from itertools import product
def ndcube(*args): #accepts a list of 2-tuples
    return list(product(*map(lambda x: range(x[0], x[1]+1), args)))

抱歉,我指的是空间的维度。所以如果将维度设置为2,则第二个将给我二维点。 - NOhs
@MrZ 哎呀,我完全忽略了“n维”的问题。没关系。 - Patrick Haugh
@MrZ,我添加了一个适用于任何超矩形的解决方案。看起来,你的第二个解决方案,加上Stefan Pochmann的修改,是你能得到的最好的。 - Patrick Haugh
不错的概括。虽然我可能会使用*x而不是x[0],x[1]。但是这样开始变得有点难以理解了。 - NOhs
@MrZ 我避免使用Python的range对象,因为它是右侧不包含 [x, y),这并不是我们想要的。一个体积为1的立方体 ndcube((1, 2), (1, 2)) 只会报告一个点,除非我们在右侧的 range 中加上一个。 - Patrick Haugh
啊,我忘了。那么你的版本是更好的。 - NOhs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接