웹사이트 검색

Python numpy.where() 메서드 사용 방법


Python에서는 numpy.where() 함수를 사용하여 조건에 따라 numpy 배열에서 요소를 선택할 수 있습니다.

뿐만 아니라 조건이 충족되면 해당 요소에 대해 일부 작업을 수행할 수 있습니다.

몇 가지 예시를 통해 이 기능을 어떻게 사용할 수 있는지 살펴보겠습니다!

Python numpy.where() 구문

이 함수는 numpy와 유사한 배열(예: 정수/부울의 NumPy 배열)을 허용합니다.

부울 값의 numpy와 유사한 배열인 조건에 따라 필터링한 후 새 numpy 배열을 반환합니다.

예를 들어, 조건array([[True, True, True]])의 값을 가질 수 있으며 이는 numpy와 같은 부울 배열입니다. (기본적으로 NumPy는 숫자 값만 지원하지만 bool로 변환할 수도 있습니다.)

예를 들어 조건array([[True, True, False]])이고 배열이 a=ndarray([[1, 2, 3]]), 배열(a[:, condition])에 조건을 적용하면 배열 ndarray([[1 2]]).

import numpy as np

a = np.arange(10)
print(a[a <= 2]) # Will only capture elements <= 2 and ignore others

산출

array([0 1 2])

참고: 동일한 조건 조건을 <= 2로 나타낼 수도 있습니다. 이것은 부울 배열로 작성하는 것이 매우 번거롭기 때문에 조건 배열에 권장되는 형식입니다.

그러나 결과의 차원을 유지하고 원래 배열의 요소를 잃지 않으려면 어떻게 해야 할까요? 이를 위해 numpy.where()를 사용할 수 있습니다.

numpy.where(condition [, x, y])

매개변수 xy가 두 개 더 있습니다. 그것들은 무엇입니까?

기본적으로 이것은 조건이 배열의 일부 요소에 대해 참이면 새 배열이 x에서 요소를 선택한다는 것입니다.

그렇지 않고 false이면 y의 요소를 가져옵니다.

이를 통해 최종 출력 배열은 condition = True일 때마다 x의 요소와 조건일 때마다 y의 요소를 포함하는 배열이 됩니다.=거짓.

xy는 선택 사항이지만 x를 지정하는 경우 y도 지정해야 합니다. 이 경우 출력 배열 모양이 입력 배열과 동일해야 하기 때문입니다.

참고: 단일 및 다차원 배열에도 동일한 논리가 적용됩니다. 두 경우 모두 조건에 따라 필터링합니다. 또한 x, y조건의 모양이 함께 브로드캐스트된다는 점을 기억하십시오.

이제 이 기능을 올바르게 이해하기 위해 몇 가지 예를 살펴보겠습니다.

Python numpy.where() 사용

numpy 배열에서 양의 요소만 가져오고 모든 음의 요소를 0으로 설정하고 싶다고 가정하고 numpy.where()를 사용하여 코드를 작성해 보겠습니다.

1. 요소를 numpy.where()로 교체

여기서는 2차원 랜덤 배열을 사용하고 양의 요소만 출력합니다.

import numpy as np

# Random initialization of a (2D array)
a = np.random.randn(2, 3)
print(a)

# b will be all elements of a whenever the condition holds true (i.e only positive elements)
# Otherwise, set it as 0
b = np.where(a > 0, a, 0)

print(b)

가능한 출력

[[-1.06455975  0.94589166 -1.94987123]
 [-1.72083344 -0.69813711  1.05448464]]
[[0.         0.94589166 0.        ]
 [0.         0.         1.05448464]]

보시다시피 이제 긍정적인 요소만 유지됩니다!

2. 조건만 있는 numpy.where() 사용

위의 코드와 관련하여 약간의 혼란이 있을 수 있습니다. 일부 사용자는 보다 직관적인 방법이 다음과 같이 조건을 작성하는 것이라고 생각할 수 있습니다.

import random
import numpy as np

a = np.random.randn(2, 3)
b = np.where(a > 0)
print(b)

이제 위의 코드를 이 변경으로 실행하면 다음과 같은 결과가 표시됩니다.

(array([0, 1]), array([2, 1]))

자세히 관찰하면 b는 이제 numpy 배열의 튜플입니다. 그리고 각 배열은 양수 요소의 위치입니다. 이것은 무엇을 의미 하는가?

조건만 제공할 때마다 이 함수는 실제로 np.asarray.nonzero()와 동일합니다.

이 예에서 np.asarray(a > 0)는 조건을 적용한 후 부울과 같은 배열을 반환하고 np.nonzero(arr_like)는 다음의 인덱스를 반환합니다. arr_like의 0이 아닌 요소. (이 링크 참조)

이제 numpy로 얼마나 유연하게 사용할 수 있는지 보여주는 더 간단한 예를 살펴보겠습니다!

import numpy as np

a = np.arange(10)

b = np.where(a < 5, a, a * 10)

print(a)
print(b)

출력

[0 1 2 3 4 5 6 7 8 9]
[ 0  1  2  3  4 50 60 70 80 90]

여기서 조건은 a < 5이며, numpy와 같은 배열 [True True True True True False False False False], x는 배열 a이고 y는 배열 a * 10입니다. 따라서 a가 < 5인 경우에만, a > 5인 경우 * 10에서 선택합니다.

따라서 이것은 10을 곱하여 >= 5인 모든 요소를 변환합니다. 이것이 우리가 실제로 얻는 것입니다!

numpy.where()로 방송하기

condition, xy 배열을 모두 제공하면 numpy는 이들을 함께 브로드캐스트합니다.

import numpy as np

a = np.arange(12).reshape(3, 4)

b = np.arange(4).reshape(1, 4)

print(a)
print(b)

# Broadcasts (a < 5, a, and b * 10)
# of shape (3, 4), (3, 4) and (1, 4)
c = np.where(a < 5, a, b * 10)

print(c)

산출

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[[0 1 2 3]]
[[ 0  1  2  3]
 [ 4 10 20 30]
 [ 0 10 20 30]]

여기서도 역시 조건에 따라 출력이 선택되므로 모든 요소가 있지만 여기서는 ba 모양으로 방송됩니다. (차원 중 하나는 요소가 하나뿐이므로 브로드캐스팅 시 오류가 발생하지 않습니다.)

따라서 b는 이제 [[0 1 2 3] [0 1 2 3] [0 1 2 3]]가 되며 이제 다음에서도 요소를 선택할 수 있습니다. 이 방송 배열.

따라서 출력의 모양은 a의 모양과 동일합니다.

결론

이 기사에서는 Python numpy.where() 함수를 사용하여 다른 조건 배열을 기반으로 배열을 선택하는 방법에 대해 배웠습니다.

참조

  • Python numpy.where() 함수에 대한 SciPy 문서