numpy.where 이해

Oct 19 2020

동일한 배열의 특정 요소보다 큰 numpy 배열 요소의 첫 번째 인덱스를 얻고 싶습니다. 나는 다음을 시도했다 :

>>> Q5=[[1,2,3],[4,5,6]]
>>> Q5 = np.array(Q5)
>>> Q5[0][Q5>Q5[0,0]]
array([2, 3])
>>> np.where(Q5[0]>Q5[0,0])
(array([1, 2], dtype=int32),)
>>> np.where(Q5[0]>Q5[0,0])[0][0]
1

Q1. Q5[0]보다 큰 요소의 첫 번째 인덱스를 얻는 올바른 방법 이 Q5[0,0]있습니까?

나는 더 많은 관심입니다 np.where(Q5[0]>Q5[0,0])튜플을 반환 (array([1, 2], dtype=int32),)이중 인덱스에 저를 따라서 필요로하는 [0][0]np.where(Q5[0]>Q5[0,0])[0][0].

Q2. 왜 이것이 튜플을 반환하지만 아래는 적절한 numpy 배열을 반환합니까?

>>> np.where(Q5[0]>Q5[0,0],Q5[0],-1)
array([-1,  2,  3])

직접 색인화 할 수 있습니다.

>>> np.where(Q5[0]>Q5[0,0],Q5[0],-1)[1]
2

답변

hpaulj Oct 19 2020 at 21:42
In [58]: A = np.arange(1,10).reshape(3,3)
In [59]: A.shape
Out[59]: (3, 3)
In [60]: A
Out[60]: 
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

np.where조건은 정말 np.nonzero입니다.

부울 배열을 생성합니다.

In [63]: A==6
Out[63]: 
array([[False, False, False],
       [False, False,  True],
       [False, False, False]])

그것이 사실 인 곳을 찾으십시오.

In [64]: np.nonzero(A==6)
Out[64]: (array([1]), array([2]))

결과는 조건의 차원 당 하나의 요소 인 튜플입니다. 각 요소는 인덱싱 배열이며 함께 True (s)의 위치를 ​​정의합니다.

여러 True를 사용한 또 다른 테스트

In [65]: (A%3)==1
Out[65]: 
array([[ True, False, False],
       [ True, False, False],
       [ True, False, False]])
In [66]: np.nonzero((A%3)==1)
Out[66]: (array([0, 1, 2]), array([0, 0, 0]))

튜플을 사용하여 원래 배열을 인덱싱합니다.

In [67]: A[np.nonzero((A%3)==1)]
Out[67]: array([1, 4, 7])

3 인수를 사용하여 where의 값의 혼합으로 새로운 배열을 만들려면 AA+10

In [68]: np.where((A%3)==1,A+10, A)
Out[68]: 
array([[11,  2,  3],
       [14,  5,  6],
       [17,  8,  9]])

조건에 True가 여러 개있는 nonzero경우 반드시 모두를 찾기 때문에 "첫 번째"를 찾는 테스트 도구가 아닙니다.

0이 아닌 튜플은 transpose. 실제로이 배열에서 "첫 번째"를 얻는 것이 더 쉬울 수 있습니다.

In [73]: np.argwhere((A%3)==1)
Out[73]: 
array([[0, 0],
       [1, 0],
       [2, 0]])

1d 배열, A 행에서 찾고 있습니다.

In [77]: A[0]>A[0,0]
Out[77]: array([False,  True,  True])
In [78]: np.nonzero(A[0]>A[0,0])
Out[78]: (array([1, 2]),)            # 1 element tuple
In [79]: np.argwhere(A[0]>A[0,0])
Out[79]: 
array([[1],
       [2]])
In [81]: np.where(A[0]>A[0,0], 100, 0)     # 3 argument where
Out[81]: array([  0, 100, 100])

따라서 1d 배열을 검색하든 2d (또는 3 또는 4)를 검색하든 차원 당 하나의 배열 요소 nonzero가있는 튜플 을 반환 합니다. 이렇게하면 항상 같은 크기의 배열을 인덱싱하는 데 사용할 수 있습니다. 1d 튜플은 중복되어 보일 수 있지만 다른 차원 결과와 일치합니다.

이와 같은 작업을 이해하려고 할 때 문서를주의 깊게 읽고 개별 단계를 살펴보십시오. 여기에서는 조건부 행렬, nonzero결과 및 다양한 용도를 살펴 봅니다 .

AsafH Oct 19 2020 at 22:05

numpy.where ()는 if가있는 for 루프와 같습니다.

numpy.where(condition, values, new_value)

조건-if 조건 과 같습니다.
- 값을 반복하는 데에
NEW_VALUE는 - 경우 생성 조건이 A의 참 가치 , 그은을 변경하려고 NEW_VALUE


1 차원 배열에 대해 작성하려면 다음과 같아야합니다.
[xv if c else yv 
for c, xv, yv in zip(condition, x, y)]

예:

>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.where(a < 5, a, 10*a)
array([ 0,  1,  2,  3,  4, 50, 60, 70, 80, 90])

먼저 0에서 9까지의 숫자 (0, 1, 2 ... 7, 8, 9)로
배열을 만든 다음 배열의 모든 값이 5에서 더 큰지 확인하고 그 값에 10을 곱합니다.
이제 5보다 작은 배열의 모든 값은 동일하게 유지되고 더 큰 모든 값에 10을 곱했습니다.

wwii Oct 19 2020 at 21:41

argmax부울 배열과 함께 사용 하면 첫 번째 True의 인덱스가 제공됩니다.

In [54]: q
Out[54]: 
array([[1, 2, 3],
       [4, 5, 6]])

In [55]: q > q[0,0]
Out[55]: 
array([[False,  True,  True],
       [ True,  True,  True]], dtype=bool)

argmax 축 / 차원 인수를 사용할 수 있습니다.

In [56]: np.argmax(q > q[0,0], 0)
Out[56]: array([1, 0, 0], dtype=int64)

즉, 첫 번째 True는 열 0에 대한 인덱스 1이고 열 1과 2에 대한 인덱스 0입니다.

In [57]: np.argmax(q > q[0,0], 1)
Out[57]: array([1, 0], dtype=int64)

즉, 첫 번째 True는 행 0에 대한 인덱스 1이고 행 1에 대한 인덱스 0입니다.


Q1. Q5 [0]에있는 요소의 첫 번째 인덱스를 Q5 [0,0]보다 큰 위의 올바른 방법입니까?

아니요 인수에 argmaxwith 1를 사용한 axis다음 해당 결과에서 첫 번째 항목을 선택합니다.

Q2. 이것이 튜플을 반환하는 이유

당신은 반환을 말했다 -1거짓 값과 반환에 대한 Q5[0]진정한 값에 대한 항목이 없습니다.

Q2 ...하지만 아래는 적절한 numpy 배열을 반환합니까?

운이 좋았고 올바른 색인을 선택했습니다.