programing

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

oldcodes 2023. 7. 18. 21:56
반응형

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

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

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

제안된 복제 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사례.x0d 배열이며, 변수입니다.

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이제 1D 어레이입니다.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페이지를 끝까지 모두 표시합니다.그 자체로nditer에서 그다지 유용하지 않습니다.python코드를 에 이식하기 전까지는 반복 속도가 빨라지지 않습니다.np.ndindex몇 안 되는 비흡연자 중 하나입니다.numpy를 사용하는 함수nditer.

은 생략부호....은 단입니다.as many : as needed.

시간이 없는 사람들을 위해, 여기 간단한 예가 있습니다.

In [64]: X = np.reshape(np.arange(9), (3,3))

In [67]: Y = np.reshape(np.arange(2*3*4), (2,3,4))

In [70]: X
Out[70]:
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

In [71]: X[:,0]
Out[71]: array([0, 3, 6])

In [72]: X[...,0]
Out[72]: array([0, 3, 6])

In [73]: Y
Out[73]:
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])

In [74]: Y[:,0]
Out[74]:
array([[ 0,  1,  2,  3],
       [12, 13, 14, 15]])

In [75]: Y[...,0]
Out[75]:
array([[ 0,  4,  8],
       [12, 16, 20]])

In [76]: X[0,...,0]
Out[76]: array(0)

In [77]: Y[0,...,0]
Out[77]: array([0, 4, 8])

이렇게 하면 한 번에 한 차원만 쉽게 조작할 수 있습니다.

한 가지 - 지정된 인덱싱 식에 줄임표를 하나만 사용할 수 있습니다. 그렇지 않으면 표현식이 몇 개인지에 대해 모호해질 수 있습니다.:각각 넣어야 합니다.

저는 (대부분의 사람들이 아마도 익숙할 것이라고 생각하는) 매우 좋은 유사점이 그렇게 생각하는 것이라고 믿습니다.

import numpy as np

random_array = np.random.rand(2, 2, 2, 2)

이런경우는에,는에,[:, :, :, 0] and [..., 0]똑같습니다.

를 들어, x 128 RGB 3, 128,의할 수 . 에서 해당 특정차분있수다니습석할원을 수행할 수 . 예를 들어, 50 128x128 RGB 이미지(50, 3, 128, 128) 배치가 있다고 가정하면, 모든 색상 채널의 모든 이미지에서 해당 이미지의 일부를 슬라이스하려면 다음 중 하나를 수행할 수 있습니다.image[:,:,50:70, 20:80] or image[...,50:70,20:80]

다음과 같은 문구에서 한 번 이상 사용할 수 없다는 것만 알아두십시오.[...,0,...]유효하지 않습니다.

언급URL : https://stackoverflow.com/questions/42190783/what-does-three-dots-in-python-mean-when-indexing-what-looks-like-a-number

반응형