복붙노트

[PYTHON] 파이썬에서 "3 점"은 숫자처럼 보이는 것을 인덱싱 할 때 무엇을 의미합니까?

PYTHON

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

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

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

해결법

  1. ==============================

    1.제안 된 복제물 Python Ellipsis 객체는 무엇을합니까? 일반적인 파이썬 컨텍스트에서 질문에 대답 할 때 nditer 루프에서 사용하려면 정보를 추가해야한다고 생각합니다.

    제안 된 복제물 Python Ellipsis 객체는 무엇을합니까? 일반적인 파이썬 컨텍스트에서 질문에 대답 할 때 nditer 루프에서 사용하려면 정보를 추가해야한다고 생각합니다.

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

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

    그래서 제 말에, x [...] = ...는 x in-place를 수정합니다; 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]])
    

    [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,)
    

    이 행의 첫 번째 희미한 점을 반복합니다. x는 1 차원 배열이며 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,)
    

    이 간단한 행 반복을 (2 차원 배열에서) 비교해보십시오 :

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

    이 행의 첫 번째 희미한 점을 반복합니다. x는 1 차원 배열이며 x [:] = ... 또는 x [...] = ....로 수정할 수 있습니다.

    끝까지이 nditer 페이지를 읽고 실험 해보십시오. 그 자체로 nditer는 파이썬에서 유용하지 않습니다. 반복 속도를 향상시키지 않습니다. 코드를 cython으로 이식 할 때까지는 안됩니다 .np.ndindex는 nditer를 사용하는 몇 가지 컴파일되지 않은 numpy 함수 중 하나입니다.

  2. from https://stackoverflow.com/questions/42190783/what-does-three-dots-in-python-mean-when-indexing-what-looks-like-a-number by cc-by-sa and MIT license