관리 메뉴

FU11M00N

[ Numpy ] numpy 조건문, 배열의 비교연산 , and or ! , where 본문

AI/Numpy

[ Numpy ] numpy 조건문, 배열의 비교연산 , and or ! , where

호IT 2021. 3. 29. 11:14
import numpy as np
import matplotlib.pyplot as plt 

- 배열의 비교연산

기본 원리는 배열에 참과 거짓값으로 이뤄진 배열을 입력하여 참인 부분에 해당하는 원소만을 억세스 할 수 있도록 제공합니다.

 

x = np.arange(3)
print( x[[True, False, True]])

결괏 값

행렬에 비교연산을 수행 시 참과 거짓으로 이뤄진 배열을 얻어낼 수 있습니다.

아래의 예시는 x의 짝여부를 조건으로 연산한 결과 입니다

print(x % 2 == 0)

결괏 값

 

그럼 해당 조건을 활용해 x에 배열 인덱스 값으로 입력하게 됩니다.

즉 배열에 특정 조건을 만족시키는 원소를 포함시키는 배열을 추출 할 수있습니다.

print(x[ x % 2 == 0])

결괏 값

- Logical OR, And, Not 연산

Numpy 배열은 and, or, not 연산을 지원하지 않습니다.

x1,x2 = np.array([True, False]), np.array([True, True])

print(x1 or x2) #error

 

 

logical을 사용하여 가능하기도 합니다.

print( np.logical_and(x1, x2))

결괏 값

 

 

하지만 logical 까지 붙이면 기니깐 아래와 같이 "&" ,"|" , "~" 로도 사용가능합니다.

logical_or : or 연산  ( | ) 
logical_and  : and 연산 ( & )
logical_not : not 연산 ( ~ ) 

 

x1,x2 = np.array([True, False]), np.array([True, True])
print( x1 & x2 )
print( x1 | x2 )
print( ~x1 )

결괏 값

- 다중 조건 사용

0부터 9까지 2와 3의 배수를 추출하는 코드를 다중 조건을 사용하면 아래와 같습니다.

 x = np.arange(10)
 print(  x[ np.logical_or( x % 2 == 0 , x % 3 == 0 )] )

결괏 값

 

아래는 이중배열을 적용한것입니다.

2차원 배열의 0,3,6,9 번째 줄에 0을 입력하는 코드입니다.

x[x%10%3 == 0] = 0 
print(x)

결괏 값

- 배열의 조건부 대입

3으로 나눴을때 나머지가 1이면 0으로 출력하고싶다면 아래와같이 가능합니다.

arr = np.arange(100).reshape(10,10)


arr[(arr%10%3==1) | ((arr/10).astype('int')%3==1)] = 0  #3으로 나눴을때 나머지가 1이면 0으로 출력

print(arr)

결괏 값

- where 함수

단순 조건문으로 해결하기 어려울때는 np.where을 사용하여 더욱 더 복잡한 작업을 할 수 있습니다.

where 함수는 조건에 맞을 경우와 틀릴경우 두가지 값을 구성된 배열을 리턴해줍니다.

where(조건 , 참인경우의 값, 거짓인 경우의 값) 

 

 

 

아래의 예제 where은 arr중 3보다 크면 1 작으면 0을 리턴합니다.

arr = np.array([1,2,3,4,5])
np.where(arr > 3 , 1, 0 )

결괏 값

고정 값뿐만 아니라 다른 배열의 값을 사용할 수있습니다.

아래의 예제에는 [0,1,2,3,4] 순차 배열인 x 배열의 조건을 사용하여 arr의 짝수번째 값만 0으로 바꾼 arr을 리턴합니다.

 

arr = np.array([10,5,3,9,1])
x = np.arange(5)
np.where( x % 2 == 0 , arr , 0)

결괏 값

 

 

(n,1) 배열과 (1,m) 크기의 배열을 연산하여 행렬곱 연산을 사용하는 경우 더욱 다양한 형태의 배열값을 다룰 수 있습니다.

 

 

아래의 예제는 3 x 4 의 격자의 축을 각각 x, y 배열로 리턴합니다.

x, y = np.ogrid[:3, :4]  # x,y = range(3).reshpae(3,1), range(4) 와 같은 뜻
print(x, y , sep = "\n")

결괏 값

두 배열을 조건 연산으로 사용할때 자동적으로 (3,4) 의 배열이 구성되면서 조건이 적용됩니다.

 

아래는 이것을 활용해 대각선 값만 access 할 수있는 예제입니다.

np.where(x == y, 1, 0)

결괏 값

 

위를 조금 응용하면 10x10의 대각선에 순차 값을 넣을수도있습니다.

 

x,y = np.ogrid[:10, :10]
np.where(x == y , y , 0)

결괏 값

- 문제

 

x축과 y축을 더했을때 작수인 배열을 만들면 아래와 같습니다.

arr=np.arange(100).reshape(10,10)
x,y = np.ogrid[:10, :10]
np.where((x + y)%2==0, arr , 0)

 

Comments