개발하자

다차원 범위에 대한 범위(n)에 해당하는 파이썬이 있나요?

Cuire 2023. 6. 30. 14:44
반응형

다차원 범위에 대한 범위(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)

반응형