[AI][Data Analysis and Machine Learning]NumPy_2

·2025년 2월 19일
post-thumbnail

기본 연산,기본함수

x= np.arange(15).reshape(3,5)
y = np.arange(0,150,10).reshape(3,5)

x
>array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
       
y
>array([[  0,  10,  20,  30,  40],
       [ 50,  60,  70,  80,  90],
       [100, 110, 120, 130, 140]])

array 간 연산

리스트의 경우

a=[1,2,3,4]
b=2
c=[100,200,300,400]

a*2
>[10, 20, 30, 40, 10, 20, 30, 40]

a+c
>[10, 20, 30, 40, 100, 200, 300, 400]

array 연산은 리스트와 달리 기본적으로 ‘원소’끼리의 연산이다

x+y
>array([[  0,  11,  22,  33,  44],
       [ 55,  66,  77,  88,  99],
       [110, 121, 132, 143, 154]])
       
       
x-y
>array([[   0,   -9,  -18,  -27,  -36],
       [ -45,  -54,  -63,  -72,  -81],
       [ -90,  -99, -108, -117, -126]])      
       

array 와 스칼라 값 연산 가능

x+10
>array([[10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])

단일값만 갖고 있는 객체와는 shape 관계없이, scalar 연산 수행

x+[[10]]
>array([[10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])
       
x+np.array([10])
>array([[10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])
       
       
       
x+np.array(10)
>array([[10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])

그러나

x+np.array([10,20])
#ValueError:operands could not be broadcast together with shapes (3,5) (

axis(차원축)

numpy의 많은 함수들은 axis= 파라미터를 가진다.

axis(축)은 각 ‘차원’을 의미한다

1차원 array 라면 각 차원에 대한 axis 값은 0 (1개)

2차원 array라면 각 차원에 대한 axis 값은 0,1 (2개)

3차원 array라면 각 차원에 대한 axis 값은 0,1,2 (3개)

axis= 값을 명시하면 그 함수의 연산은 해당 axis에 따라서 연산을 수행한다.

 x1 = np.arange(15)
 x1
 >array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])
 
 
 np.sum(x1)
 >105
 
 
 np.sum(x1,axis=None)
 >105
 
 x2 = x1.reshape(3,5)
 x2
 >array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
       
       

 
 
 
 

axis 설정하여 합을구하면

 x2.shape
 >(3,5)
 
 np.sum(x2)
 >105
 
 np.sum(x2,axis=0)
 >array([15, 18, 21, 24, 27])

⇒(3,5)→(5,) 즉 0번째 axis 가 제거된거임

np.sum(x2,axis=1)
>array([10, 35, 60])

np.sum(x2,axis=-1)
>array([10, 35, 60])

⇒(3,5)→(3,) 즉 0번째 axis 가 제거된거임

Broadcasting

  • 기본적으로는 Shape이 같은 ndarray에 대한 연산은 각 원소별로 진행
  • 다른 Shape 을 갖는 array 간 연산의 경우 브로드 캐스팅(shape를 맞춤) 후 진행한다

x = np.arange(15).reshape(3,5)
x
>array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
       
       
y = np.random.rand(15).reshape(3,5)
y
>array([[0.69187711, 0.31551563, 0.68650093, 0.83462567, 0.01828828],
       [0.75014431, 0.98886109, 0.74816565, 0.28044399, 0.78927933],
       [0.10322601, 0.44789353, 0.9085955 , 0.29361415, 0.28777534]])       

x+y
> array([[ 0.69187711,  1.31551563,  2.68650093,  3.83462567,  4.01828828],
       [ 5.75014431,  6.98886109,  7.74816565,  8.28044399,  9.78927933],
       [10.10322601, 11.44789353, 12.9085955 , 13.29361415, 14.28777534]]) 
       

shape가 다른 경우

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

a #(4,3)
>array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])
       
 b #(3,)
 >array([100, 101, 102])
 
 
 
 a+b
 >array([[100, 102, 104],
       [103, 105, 107],
       [106, 108, 110],
       [109, 111, 113]])
 
 
 
 
 
 

브로드캐스팅 규칙

  • 뒷 차원에서부터 비교하여
    • Shape 이 같거나

    • 차원 중 값이 1이 존재하면

      ⇒가능!!

  • 결과 차원은 둘 중 큰 size의 차원으로 확장된다.
c = np.arange(1000,1004)
c
>array([1000,1001,1002,1003])

print(a.shape)
print(c.shape)
>(4,3)
(4,)
=> broadcasting 불가
a = np.full(4,100)   #(4,)
a
>array([100,100,100,100])

a+1
>array([101, 101, 101, 101])
a+[1]  #(4,) + (1,)
>array([101, 101, 101, 101])
b = np.arange(1,9).reshape(2,4)
b
>array([[1, 2, 3, 4],
       [5, 6, 7, 8]])
       
       
  • a:(4,)
  • b:(2,4)
  • ⇒(2,4)
a+b
>array([[101, 102, 103, 104],
       [105, 106, 107, 108]])
       
       

Boolean Indexing

array 인덱싱 시에 bool 리스트를 전달하여 True 인 경우만 필터링한다

for 사용x고도 array에서 조건에 맞는 데이터만 추출 하는 기능


x = np.random.rnadint(1,100,size=10)
x

>array([28, 38, 58, 84, 39,  9, 33, 35, 11, 24])

x%2
>array([0, 0, 0, 0, 1, 1, 1, 1, 1, 0])

even_mask = x%2==0
even_mask
>array([ True,  True,  True,  True, False, False, False, False, False,
        True])

→bool 값으로 이루어진 array를 Mask 라고도 한다.

x[even_mask]
>array([28, 38, 58, 84, 24])

list 나 tuple 같은 iterable도 boolmask로 사용 가능하다

x[[ True,  True,  True,  True, False, False, False, False, False, True]]

>array([28, 38, 58, 84, 24])

다중조건 사용

  • 파이썬 논리 연산자인 and or not 키워드는 사용 X
  • &, | 사용해야함
  • 짝수이면서 30보다 작은 숫자들
x[(x%2==0) & (x<30)]
>array([28,24])

astype() 으로 변환

True, int(True),False,int(False)
>(True,1,False,0)

x>50
>array([False, False,  True,  True, False, False, False, False, False,
       False])
       
       
(x>50).astype(int)
>array([0, 0, 1, 1, 0, 0, 0, 0, 0, 0])

(x>50).astype(int).sum()
>2

True+True
2
profile
어리둥절 빙글빙글 돌아가는 코딩세상~

0개의 댓글