개발/Python

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

MinorMan 2021. 1. 12. 12:24
반응형

<질문>

이것은 나왔다Hidden features of Python,하지만 기능 작동 방식을 설명하는 좋은 문서 나 예제를 볼 수 없습니다.


<답변1>

Ellipsis, 또는...숨겨진 기능이 아니라 상수 일뿐입니다. 언어 구문의 일부인 자바 스크립트 ES6와는 상당히 다릅니다. 내장 클래스 나 Python 언어 구성이이를 사용하지 않습니다.

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

Numpy는documentation. 몇 가지 예here.

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

>>> 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

물론python documentation, 및language reference. 그러나 그것들은별로 도움이되지 않습니다.


<답변2>

생략 부호는 numpy에서 더 높은 차원의 데이터 구조를 분할하는 데 사용됩니다.

의미하도록 설계되었습니다.이 점에서, 다수의 슬라이스로 삽입 전체 ( : ) 모든 치수 다차원 슬라이스 연장.

:

>>> 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])

자신의 구현에서 위에서 언급 한 계약을 무시하고 적합하다고 생각되는 모든 용도로 사용할 수 있습니다.


<답변3>

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


<답변4>

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

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

예:

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

이로 인해 오류가 발생합니다.

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

이것은 작동합니다 :

a[...,0,:]
array([0, 1])
반응형