숫자처럼 보이는 것을 인덱싱 할 때 파이썬에서“세 개의 점”은 무엇을 의미합니까?


90

x[...]아래 의 의미는 무엇입니까 ?

a = np.arange(6).reshape(2,3)
for x in np.nditer(a, op_flags=['readwrite']):
    x[...] = 2 * x

1
그것은 목록이 아닙니다.
user2357112는 Monica 지원 Monica


1
이것을 이해하는 재미있는 방법은 James Powell의 이야기입니다. youtube.com/watch?v=65_-6kEAq58
SARose

답변:


70

제안 된 복제 동안 Python Ellipsis 객체는 무엇을합니까? 일반적인 python맥락 에서 질문에 답하기 때문에 nditer루프 에서 사용 하려면 추가 정보가 필요하다고 생각합니다.

https://docs.scipy.org/doc/numpy/reference/arrays.nditer.html#modifying-array-values

Python의 정규 할당은 기존 변수를 제자리에서 수정하는 대신 단순히 로컬 또는 전역 변수 사전의 참조를 변경합니다. 즉, 단순히 x에 할당하면 값이 배열의 요소에 배치되지 않고 x가 배열 요소 참조에서 할당 한 값에 대한 참조로 전환됩니다. 배열의 요소를 실제로 수정하려면 x를 줄임표로 인덱싱해야합니다.

이 섹션에는 코드 예제가 포함되어 있습니다.

제 말로, x[...] = ...수정 x은 제자리에 있습니다. 변수에 x = ...대한 링크가 끊어지고 nditer변경되지 않았을 것입니다. 비슷 x[:] = ...하지만 모든 차원 (0d 포함)의 배열에서 작동합니다. 이 맥락에서 x단순한 숫자가 아니라 배열입니다.

nditer반복에 가장 가까운 것은 다음과 같습니다 nditer.

In [667]: for i, x in np.ndenumerate(a):
     ...:     print(i, x)
     ...:     a[i] = 2 * x
     ...:     
(0, 0) 0
(0, 1) 1
...
(1, 2) 5
In [668]: a
Out[668]: 
array([[ 0,  2,  4],
       [ 6,  8, 10]])

a[i]직접 인덱싱하고 수정해야했습니다 . 나는 사용할 수 없었습니다 x = 2*x. 이 반복에서는 x스칼라이므로 변경할 수 없습니다.

In [669]: for i,x in np.ndenumerate(a):
     ...:     x[...] = 2 * x
  ...
TypeError: 'numpy.int32' object does not support item assignment

그러나 nditer경우 x에는 0d 배열이며 변경 가능합니다.

In [671]: for x in np.nditer(a, op_flags=['readwrite']):
     ...:     print(x, type(x), x.shape)
     ...:     x[...] = 2 * x
     ...:     
0 <class 'numpy.ndarray'> ()
4 <class 'numpy.ndarray'> ()
...

그리고 0d이기 때문에 x[:]대신 사용할 수 없습니다.x[...]

----> 3     x[:] = 2 * x
IndexError: too many indices for array

더 간단한 배열 반복으로도 통찰력을 얻을 수 있습니다.

In [675]: for x in a:
     ...:     print(x, x.shape)
     ...:     x[:] = 2 * x
     ...:     
[ 0  8 16] (3,)
[24 32 40] (3,)

이것은의 행 (첫 번째 희미 함)에서 반복됩니다 a. x그런 다음 1d 배열이며 x[:]=...또는 로 수정할 수 있습니다 x[...]=....

내가 추가하는 경우와 external_loop다음에서 플래그를 섹션 , x지금은 1 차원 배열이며, x[:] =작동합니다. 그러나 x[...] =여전히 작동하고 더 일반적입니다. x[...]다른 모든 nditer예에서 사용됩니다 .

In [677]: for x in np.nditer(a, op_flags=['readwrite'], flags=['external_loop']):
     ...:     print(x, type(x), x.shape)
     ...:     x[...] = 2 * x
[ 0 16 32 48 64 80] <class 'numpy.ndarray'> (6,)

이 간단한 행 반복 (2d 배열에서)을 비교하십시오.

In [675]: for x in a:
     ...:     print(x, x.shape)
     ...:     x[:] = 2 * x
     ...:     
[ 0  8 16] (3,)
[24 32 40] (3,)

이것은의 행 (첫 번째 희미 함)에서 반복됩니다 a. x그런 다음 1d 배열이며 x[:] = ...또는 로 수정할 수 있습니다 x[...] = ....

nditer페이지를 끝까지 읽고 실험 하십시오. 그 자체로 nditerpython. 반복 속도를 높이 지 않습니다 cython. 코드를 . 를 사용 np.ndindex하는 몇 안되는 컴파일되지 않은 numpy함수 중 하나입니다 nditer.


x [1, :, ...]과 같은 것 역시 허용되는 구문입니다. 나중에 참조 할 수 있도록 남겨 둡니다.
borgr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.