숫자처럼 보이는 것을 인덱싱할 때 파이썬의 "세 개의 점"은 무엇을 의미합니까?
의 의미는 무엇입니까?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
사례.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,)
이것은 다음의 행(첫 번째 어둡게)에서 반복됩니다.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
'programing' 카테고리의 다른 글
듀얼에서 N개의 행을 반환하는 SQL 쿼리 (0) | 2023.07.18 |
---|---|
장고 프레임워크의 양식 필드에서 가치를 얻는 방법은 무엇입니까? (0) | 2023.07.18 |
JDBC를 사용하여 Oracle에 연결하기 위해 자격 증명 저장을 피하는 방법은 무엇입니까? (0) | 2023.07.18 |
HTTP 오류 429(Too Many Requests) 파이썬을 방지하는 방법 (0) | 2023.07.18 |
Java에서 Closeable 인터페이스의 Close() 메서드의 동일성은 어떻게 보장됩니까? (0) | 2023.07.18 |