파이썬에서 줄임표 슬라이싱 구문을 어떻게 사용합니까?


답변:


102

Ellipsis...숨겨진 기능이 아니 거나 상수 일뿐입니다. 언어 구문의 일부인 Javascript ES6과는 상당히 다릅니다. 내장 클래스 나 파이썬 언어 구성 요소가이를 사용하지 않습니다.

따라서 그 구문은 전적으로 귀하 또는 다른 사람이 코드를 이해하는 데 달려 있습니다.

Numpy는 문서에 명시된대로이를 사용합니다 . 여기 몇 가지 예가 있습니다 .

자신의 수업에서 다음과 같이 사용합니다.

>>> class TestEllipsis(object):
...     def __getitem__(self, item):
...         if item is Ellipsis:
...             return "Returning all items"
...         else:
...             return "return %r items" % item
... 
>>> x = TestEllipsis()
>>> print x[2]
return 2 items
>>> print x[...]
Returning all items

물론 파이썬 문서언어 참조가 있습니다. 그러나 그다지 도움이되지 않습니다.


6
모든 항목을 말하는 "적절한"방법 이후로 상당히 깨져 보입니다. >>> x [:] >>> x [:, 1 : 2]
Ronny

30
@Ronny : 요점은 Ellipsis의 커스텀 사용법을 보여주는 것이 었습니다.
nosklo

7
링크가 끊어진 것 같습니다.
SwiftsNamesake

231

줄임표는 높은 차원의 데이터 구조를 슬라이스하기 위해 숫자로 사용됩니다.

이 시점에서 :다차원 슬라이스를 모든 차원으로 확장하기 위해 전체 슬라이스 ( )를 많이 삽입 하도록 설계되었습니다 .

:

>>> from numpy import arange
>>> a = arange(16).reshape(2,2,2,2)

이제 2x2x2x2 차수의 4 차원 행렬이 있습니다. 4 차원에서 첫 번째 요소를 모두 선택하려면 줄임표 표기법을 사용할 수 있습니다.

>>> a[..., 0].flatten()
array([ 0,  2,  4,  6,  8, 10, 12, 14])

어느 것이

>>> a[:,:,:,0].flatten()
array([ 0,  2,  4,  6,  8, 10, 12, 14])

자체 구현에서는 위에서 언급 한 계약을 무시하고 원하는대로 사용할 수 있습니다.


어쩌면 내가 틀렸지 만 a[:,:,:,0]사본을 반환하고 사본 이 아닌 a[...,0]"보기"를 반환하는 것이 아닌가? 나는 id()버전과 3 차원 배열 모두에 대해 실행하려고 시도했습니다 . a[:,:,:, 0], a[:,:,:, 1], a[:,:,:, 2] 모두 다른 ID를 가지고 있지만 a[..., 0], a[..., 1], a[..., 2] 모두 동일한 ID를 가지고 있습니다.
mohitsharma44

내 컴퓨터에없는 @ mohitsharma44;) id()는 둘 다에 대해 동일한 값을 반환합니다. 또한 확인 __array_interface__['data']하면 동일한 메모리 주소가 표시됩니다.
BoltzmannBrain

우리는 a[indexes, ...]1 차원 배열 인 동안에도 사용할 수 있습니다 !
acgtyrant

1
타원은 0 차원 데이터 구조에도 유용합니다. 그것들은 내가 스칼라 numpy.ndarrays에 쓰는 것을 알고있는 유일한 방법입니다. 예 : my_scalar = np.asarray (3); my_scalar [...] = 5. my_scalar [:] = 5를 수행하면 :에 대한 차원 0이 없으므로 반복 할 오류가 발생합니다.
SuperElectric

1
@SuperElectric my_scalar.itemset (scalarvalue)을 사용할 수도 있습니다. 물론, my_scalar [...] = scalar_value는 더 짧지 만, 위의 주석에서 이것이 당신이 아는 유일한 방법이라고 말했습니다. 그냥 대안을 제공합니다.
kamathln

70

이것은 슬라이스와 관련이없는 Ellipsis의 또 다른 용도입니다. 필자는 종종 큐와의 스레드 내 통신에서이를 "완료"신호로 사용합니다. 거기에 있고, 객체이고, 싱글 톤이며, 그 이름은 "없음"을 의미하며, 과도하게 사용 된 없음 (일반적인 데이터 흐름의 일부로 대기열에 넣을 수 있음)이 아닙니다. YMMV.


14
"Done = object ()"라고 말하고 사용하는 것이 더 명확하지 않습니까?
Brandon Rhodes

12
반드시 그런 것은 아닙니다. 실제로 어딘가에 Done = object () 라고 말해야 합니다. 센티넬 값은 반드시 나쁜 것은 아니지만 센티넬이 거의 쓸모없는 파이썬 싱글 톤을 사용하는 것은 그렇게 끔찍한 IMO (Ellipsis와 ()는 None이 혼란 스러울 곳에서 사용한 것입니다)입니다.
Rick Copeland

6
Done = object ()와 관련하여 특히 줄과 통신하는 데 줄임표를 사용하는 경우 줄임표를 사용하는 것이 좋습니다. 스레드 내에서 프로세스 간 통신으로 이동하면 다른 프로세스에서 id (Done)가 동일하지 않으며 한 개체를 다른 개체와 구별 할 수있는 것이 없습니다. 줄임표의 ID도 같지 않지만 적어도 유형은 동일합니다. 이것이 싱글 톤의 요점입니다.
Tristan Reid

질문에 "어떻게 줄임표를 사용합니까?"라는 메시지가 표시되지만이 방법을 잘못 사용했다고 생각합니다. 많은 해석이 있습니다. 그러나 올바른 생각은 "타원은 어떻게 사용됩니까?"입니다. "내 코드에서 줄임표를 사용하려면 어떤 단계를 수행해야합니까?"
Lyndon White

6

다른 답변에서 언급했듯이 슬라이스를 만드는 데 사용할 수 있습니다. 많은 전체 슬라이스 표기법 ( :) 을 쓰지 않으려 는 경우 또는 조작 할 배열의 차원이 무엇인지 확실하지 않은 경우에 유용합니다.

강조해야한다고 생각하고 다른 답변에서 누락 된 것은 채울 치수가 더 이상 없을 때도 사용할 수 있다는 것입니다.

예:

>>> from numpy import arange
>>> a = arange(4).reshape(2,2)

오류가 발생합니다.

>>> a[:,0,:]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: too many indices for array

이것은 작동합니다 :

a[...,0,:]
array([0, 1])
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.