다차원 범위에 대한 범위(n)에 해당하는 파이썬이 있나요?
다차원 범위에 대한 범위(n)에 해당하는 파이썬이 있나요?
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)):
나는 구현을 요구하는 것이 아니다. 이것이 인식되는 패턴인지, 파이썬이나 그것의 표준/공통 라이브러리에 내장된 기능이 있는지 알고 싶습니다.
이것에 대한 간단한 구문이 있습니다. 두 개만 있으면 됩니다:
>>> [(x,y) for x in range(3) for y in range(2)]
[(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1)]
다음을 사용할 수 있습니다:
>>> import itertools
>>> for (i,j,k) in itertools.product(xrange(3),xrange(3),xrange(3)):
... print i,j,k
만약 당신이 이것을 10차원 루프나 비슷하게 우스꽝스러운 것으로 확대하고 싶다면, 반복되는 여러 문장들은 다음과 같이 표현될 수 있다:
>>> for combination in itertools.product( xrange(3), repeat=10 ):
... print combination
10개의 변수를 루프하고 ~에서 ~까지 다양합니다.
일반적으로 엄청나게 멋진 모듈이다. 마찬가지로 regexps는 "평범한" 문자열 방법보다 훨씬 더 표현력이 높으며 복잡한 루프를 표현하는 매우 우아한 방법이다. 그것은 여러분의 삶을 더 재미있게 만들 것입니다.
모듈에서 사용할 수 있습니다.
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)
다음을 살펴봅니다:
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)]
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
Numpy는 당신이 제시한 예에 적합하지만 모든 사용 사례에 적합하지는 않습니다. 임의의 , , 및 를 모두 허용하는 파이썬의 내장형과는 달리, numpy는 a만 허용한다. (이 는 , 는 로 추정되며, 는 이다.)
여기에 내장된 기능과 더 유사한 기능을 하는 구현이 있습니다. 즉, 임의의 // 인수를 허용하지만 단순한 정수 대신 작동합니다.
from itertools import product, starmap
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(range, zip(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)