是否有一个Python等同的范围(n)的多维范围?(Is there a Python equiva

2019-06-23 12:49发布

关于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的内置功能或者是标准的/公共库。

Answer 1:

在numpy的,它是numpy.ndindex 。 也看看numpy.ndenumerate

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


Answer 2:

你可以使用itertools.product()

>>> import itertools
>>> for (i,j,k) in itertools.product(xrange(3),xrange(3),xrange(3)):
...     print i,j,k

多重反复xrange()语句可以表示像这样,如果你想扩展这个高达十维环或一些类似的荒谬:

>>> for combination in itertools.product( xrange(3), repeat=10 ):
...     print combination

其中超过10个变量,从不同的循环(0,0,0,0,0,0,0,0,0,0)(2,2,2,2,2,2,2,2,2,2)


一般来说itertools是一个疯狂真棒模块。 以同样的方式正则表达式是远远大于“普通”字符串方法更具表现力, itertools是表达复杂的循环的一个非常优雅的方式。 你应该为自己读itertools模块文档。 它将使你的生活增添更多乐趣。



Answer 3:

这里实际上是一个简单的语法。 你只需要两个for 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)]


Answer 4:

这是笛卡尔乘积 ,因此两个列表:

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)


Answer 5:

您可以使用productitertools模块。

itertools.product(range(3), range(2))


Answer 6:

我想看看numpy.meshgrid

http://docs.scipy.org/doc/numpy-1.6.0/reference/generated/numpy.meshgrid.html

这将给你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)]

要么

zip(X.ravel(order='F'),Y.ravel(order='F')) 
# [(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1)]


Answer 7:

NumPy的的ndindex()为你的作品给的例子,但它不会成为所有用例。 与Python的内置range()它允许两个任意的startstopstep ,numpy的的np.ndindex()只接受stop 。 (该start被假定为(0,0,...)并且所述step(1,1,...)

下面是更像内置的实施range()函数。 也就是说,它允许任意start / stop / step参数,但它适用于元组 ,而不是单纯的整数。

import sys
from itertools import product, starmap

# Python 2/3 compatibility
if sys.version_info.major < 3:
    from itertools import izip
else:
    izip = zip
    xrange = range

def ndrange(start, stop=None, step=None):
    if stop is None:
        stop = start
        start = (0,)*len(stop)

    if step is None:
        step = (1,)*len(stop)

    assert len(start) == len(stop) == len(step)

    for index in product(*starmap(xrange, izip(start, stop, step))):
        yield index

例:

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)


文章来源: Is there a Python equivalent of range(n) for multidimensional ranges?