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


답변:


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.