对于多维范围,是否存在与range(n)相当的Python?

对于多维范围,是否存在与range(n)相当的Python?,python,numpy,iteration,range,Python,Numpy,Iteration,Range,在Python上,范围(3)将返回[0,1,2]。多维范围是否有等价物 range((3,2)) # [(0,0),(0,1),(1,0),(1,1),(2,0),(2,1)] 因此,例如,在基于平铺的游戏中,通过矩形区域的平铺循环可以写成: for x,y in range((3,2)): 注意,我不是在要求实现。我想知道这是否是一个公认的模式,Python上是否有内置函数,或者它的标准/公共库。实际上有一个简单的语法。您只需要为s设置两个: >>> [(x,y) for

在Python上,范围(3)将返回[0,1,2]。多维范围是否有等价物

range((3,2)) # [(0,0),(0,1),(1,0),(1,1),(2,0),(2,1)]
因此,例如,在基于平铺的游戏中,通过矩形区域的平铺循环可以写成:

for x,y in range((3,2)):

注意,我不是在要求实现。我想知道这是否是一个公认的模式,Python上是否有内置函数,或者它的标准/公共库。

实际上有一个简单的语法。您只需要为s设置两个

>>> [(x,y) for x in range(3) for y in range(2)]
[(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1)]

您可以使用
itertools.product()

如果您想将其放大到一个十维循环或类似荒谬的东西,那么多个重复的
xrange()
语句可以这样表示:

>>> for combination in itertools.product( xrange(3), repeat=10 ):
...     print combination
循环10个变量,从
(0,0,0,0,0,0,0,0,0)
(2,2,2,2,2,2,2)



一般来说,
itertools
是一个非常棒的模块。同样,regexp比“普通”字符串方法更具表现力,
itertools
是一种非常优雅的复杂循环表达方式。它将使您的生活更加有趣。

您可以使用
itertools
模块中的
product

itertools.product(range(3), range(2))
因此,这是两份清单中的一份:

import itertools
for element in itertools.product(range(3),range(2)):
    print element
给出此输出:

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

我想看看
numpy.meshgrid

这将为您提供网格/栅格中每个位置的X和Y栅格值。然后你可以做一些类似的事情:

import numpy as np
X,Y = np.meshgrid(xrange(3),xrange(2))
zip(X.ravel(),Y.ravel()) 
#[(0, 0), (1, 0), (2, 0), (0, 1), (1, 1), (2, 1)]

在努比,这是一个很好的选择。也来看看

例如

这将产生:

0 0
0 1
1 0
1 1
2 0
2 1
Numpy的
ndindex()
适用于您给出的示例,但并不适用于所有用例。与Python内置的
range()
不同,它允许任意的
开始
停止
,和
步骤
,numpy的
np.ndix()
只接受
停止
。(假定
开始
(0,0,…)
,而
步骤
(1,1,…)

这里的实现更像是内置的
range()
函数。也就是说,它允许任意的
开始
/
停止
/
步骤
参数,但它对元组有效,而不仅仅是整数

导入系统 来自itertools导入产品starmap #Python 2/3兼容性 如果sys.version_info.major<3: 从itertools导入izip 其他: izip=zip xrange=范围 def ndrange(开始、停止=无,步骤=无): 如果停止为无: 停止=开始 开始=(0,)*len(停止) 如果步骤为无: 步骤=(1,)*len(停止) 断言len(开始)==len(停止)==len(步骤) 对于产品中的索引(*星图(xrange,izip(开始、停止、步骤)): 产量指数
例如:

In [7]: for index in ndrange((1,2,3), (10,20,30), step=(5,10,15)):
   ...:     print(index)
   ...:
(1, 2, 3)
(1, 2, 18)
(1, 12, 3)
(1, 12, 18)
(6, 2, 3)
(6, 2, 18)
(6, 12, 3)
(6, 12, 18)

与您的上一个答案相比有一点小小的改进:
对于产品(*[xrange(5)]*3)):打印c
:从(0,0,0)到(4,4,4)如果您想要精确的副本,实际上最好使用
itertools.tee()
,我相信由于缓存,底层实现更高效。@agf:好的捕获-显然是我睡觉的时间了。编辑到这个效果。这很好,但我想指出的是,它可能会变得有点冗长:for(x,y)in[(x,y)for x in range(3)for y in range(2)]:在这里还可以提到
numpy.mgrid
numpy.ogrid
。+1:其语法与OP最初要求的语法惊人地相似。打得好!正如李昂所指出的,这与我所要求的惊人地相似,因此,毫无疑问,这是这个主题的最佳答案。李昂业的答案也很好,并且有一些经验,因为它表明笛卡尔积可以用于相同的目的。这使得大量使用Numpy数组的东西更加通用,太强大了。正好赶上冲刺!
import numpy as np
for x, y in np.ndindex((3,2)):
    print(x, y)
0 0
0 1
1 0
1 1
2 0
2 1
In [7]: for index in ndrange((1,2,3), (10,20,30), step=(5,10,15)):
   ...:     print(index)
   ...:
(1, 2, 3)
(1, 2, 18)
(1, 12, 3)
(1, 12, 18)
(6, 2, 3)
(6, 2, 18)
(6, 12, 3)
(6, 12, 18)