python-library 용어정리 (numpy)

2024. 10. 13. 21:23·용어정리/Python-Library

오늘 정리할 주제는 numpy입니다.


 

NumPy

NumPy란?

numpy는 numetical python의 줄임말로 과학 계산에 강력한 성능을 제공하는 파이썬의 라이브러리 이다.

다차원 배열에서 효율적으로 계산이 가능하게 하는 다양한 함수를 포함시키고 있으며, 

이로인해서 데이터분석, 머신러닝 및 딥러닝에서 기초로 사용된다.

 

numpy의 주요 특징으로는 이렇게 있다.

  1. 파이썬 라이브러리 이지만 c언어로 작성이 되어 있어서, 파이썬 기존의 리스트 보다 빠르게 연산이 가능하다.
  2. 배열간의 수학적 계산을 효율적으로 수행할 수 있다.
  3. 복잡한 수학적 계산 (선형대수 나 통계 함수)도 간단하게 처리가 가능하다.

 

용어

  1. Array - 배열
  2. 행 - 데이터베이스에서 가로
  3. 열 - 데이터베이스에서 세로
  4. 속성 - 클래스의 속성과 같은 뜻 ( 호출시 .속성)
  5. 메서드 - 클래스의 메서드와 같은 뜻 ( 호출시 .메서드())

 

배열 생성하기

numpy는 기본적으로 배열이나 행렬같은 다차원 데이터 구조에서의 계산을 담당한다.

그렇기에 기본적으로 배열을 생성 하는것이다.

 

#배열을 생성하기
import numpy as np

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

 

위의 코드를 보면, 현재 생성한 배열은 1차원 데이터 구조이다. 

시리즈와 비슷하다고 볼 수 있는데, 이를 알 수 있는 것은 array함수 안의 ()에서 알 수 있다.

기본적으로 1차원은 [] 1개 2차원은 [] [] 이렇게 값을 나눌 수 있다.

 

 

 

결과값

print(arr)
>> [1 2 3 4 5]

arr
>> array([1, 2, 3, 4, 5])

 

이는 print 와 arr의 매직 메서드의 반환값이 다르기 때문에 일어난 차이이다.

 

 

 

배열 확인하기

배열을 계속 사용하다보면, 이 배열의 데이터 차원이 어떤지 확인을 해야 할 때가 있다.

만약 배열간의 계산을 해야 하는 경우, 계산에 조건에 맞는 배열이 되지 않는다면 에러가 나오기 때문에,

현재 의 배열이 어떤 상태인지 알아야 한다.

 

 

arr.shape
>>(5,)

 

위의 코드 shape를 사용하게 된다면, 현재의 배열 상태를 볼 수 있다.

 

이때 (5,)는 보면 알수 있듯 값을 튜플로 반환했기 때문에 싱글데이터일 경우 쉼표를 붙였다.

 

여기서 (5,)의 의미는 1차원에서 값을 5개 가지고 있다 라는 뜻이다.

 

다른 차원일 때는 배열을 변경해보고 알아보자!

 

 

차원 확인하기

현재의 차원만 확인을 하고 싶을 수 있다.

 

이때는 ndim을 사용한다.

 

arr.shape
>> (5,)

arr.ndim
>> 1

 

 

 

배열 변경하기

만약 1차원 데이터 타입에서 2차원 또는 다차원으로 배열을 변경하고 싶다면 어떻게 해야할가?

이때는 reshaped를 사용하면 된다.

 

new_arr = arr.reshape((1,5))

 

배열의 차원을 변경 하고 싶다면, reshape 를 사용하면 된다.

 

이때 왜 (())를 2개 썻는지 궁금할 수 있다. 

 

위의 배열 값을 확인 할떄도 알 수 있듯, 배열의 구조 자체가 하나의 튜플 이기 때문이다.

 

위의 (1,5)배열의 뜻은 2차원의 데이터가 1행 5열 로 되어 있다 라는 뜻이다.

 

다른 예시로 설명을 덧붙여 보겠다.

 

arr3 = np.array([1,2,3,4,5,6])
arr3.reshape((2,3))
arr3

>> array([[1, 2, 3],
        [4, 5, 6]])
        
     
arr3,reshape((6,1))
arr3

>> array([[1],
        [2],
        [3],
        [4],
        [5],
        [6]])

 

이렇게 나타낼 수 있다. 즉 (행, 열) 을 나타낸다.

 

만약 차원이 높아질 수록 그 값은 앞으로 붙는다.

 

 

만약 3차원의 데이터값

2차원 즉 [1,2,3] [4,5,6] 인 2차원이 2개 있다는 3차원은

만약 3차원이 2개의 2차원으로 이뤄져 있으면 (2,2,3) 이렇게 될 것이다.

 

계산을 해보자면, 12개의 값(2 x 2 x 3)이 하나의 3차원 배열에 들어있다 라고 볼 수 있다.

 

 

 

차원이 없는 배열

차원이 없는 배열을 생성 할 수 있다.

지금 단계에서는 이것이 왜 필요한지는 모르겟다.

 

no_arr = np.array(1)
no_arr 
>> array(1)

no_arr.shape
>> ()

 

이렇게 차원이 없는 단일값 배열이 완성이 됬다.

 

 

 

배열의 메서드와 속성들

배열을 컨트롤 할때 필요한 속성들의 코드예제와 설명을 덧붙이겠다.

 

 

값의 갯수 확인하기

arr = np.array([1,2,3])
arr.size
>> 3

 

 

데이터의 타입 확인하기

arr = np.array([1,2,3])
arr.dtype
>> dtype('int32')

 

 

배열의 용량 확인하기

arr = np.array([1,2,3])
arr.nbytes
>> 12

 

 

배열 차원 변경하기

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

 

 

1차원으로 변경시키기

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

 

 

1차원으로 값 반환하기

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

arr
>> array([[1, 2, 3],
        [4, 5, 6]])

 

 

값 더하기

arr = np.array([[1, 2, 3], [4, 5, 6]])
arr.sum()
>> 21

 

 

열기준으로 더하기

arr = np.array([[1, 2],[3, 4],[5, 6]])
arr.sum(axis = 0)
>> array([9, 12])

 

 

행기준으로 더하기

arr = np.array([[1, 2],[3, 4],[5, 6]])
arr.sum(axis = 1)
>> array([3, 7, 11])

 

 

평균 계산하기

arr = np.array([[1, 2],[3, 4],[5, 6]])
arr.mean()
>> 3.5

 

 

최대값 구하기

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

 

 

최소값 구하기

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

 

 

배열의 가능한 속성과 메서드 확인

dir(arr)

 

 

0 또는 1 로 채워진 배열 생성하기

#0으로 채워진 배열
#1로 채우고 싶다면 np.ones
arr_zero = np.zeros((2,3))
arr_zero
>> array([[0., 0., 0.],
        [0., 0., 0.]])

 

 

특정 숫자로 채워진 배열 생성하기

arr_num = np.full((2,3),7)
arr_num
>> array([[7, 7, 7],
        [7, 7, 7]])

 

 

연속적인 값으로 채워진 배열 생성하기

arr = np.arange(10)
>> array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

 

 

 

심화

심화는 나도 잘 모르지만, 우선 기록을 하기 위해 남겨두겠다.

 

 

단차행렬 확인하기

arr = np.array([1,2,3])
arr.T
>> array([1,2,3])

 

 

배열의 행과 열을 변경 (트랜스포즈)

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

 

 

등등 많이 있다. 모든 수학적 계산은 numpy를 사용해서 가능하다.

선형대수를 안다면, 함수의 이름을 추론하여 넣으면 거의 맞게 실행이 된다. (라고함)

 

 

수학 연산

이렇게 다양하게 배열을 만드는 것은 전부 수학적인 연산을 쉽게 하시 위해서이다.

밑에는 수학 연산의 예제들이다.

 

 

배열에 특정 숫자 더하기

arr = np.array([1, 2, 3, 4, 5])
arr = arr + 10
arr
>> array([11, 12, 13, 14, 15])

 

 

배열에 특정 숫자 나누기

arr = np.array([1, 2, 3, 4, 5])
arr = arr / 2
arr
>> array([0.5, 1. , 1.5, 2. , 2.5])

 

★이때, arr /= 2 는 불가능하다. 이유인 즉슨, 현재 배열의 타입은 int32 인 반면, 나눗셈을 하게되면, float으로 바뀌기 때문에, 데이터 타입이 변경이 될때는 복합 대입 연산자를 사용 불가하다. (만약 배열을 float으로 변경하면 된다)

 

 

두 배열의 합 구하기

arr = np.array([1, 2, 3, 4, 5])
arr1 = np.array([11, 12, 13, 14, 15])
arr + arr1
>> array([12, 14, 16, 18, 20])

 

★리스트의 합은 리스트의 값이 늘어나는 정도기 때문에, 배열을 사용해서 합을 구할 수 있다.

 

 

두 배열의 곱 구하기 

arr = np.array([1, 2, 3, 4, 5, 6])
arr1 = np.array([11, 12, 13, 14, 15, 16])
arr = arr.reshape((2,3))
arr1 = arr1.reshape((2,3))
arr * arr1
>>array([[11, 24, 39],
        [56, 75, 96]])

 

★두 배열의 곱에서는 차원이 같거나 1개의 값만을 가지고 있을때 가능하며, 차원이 같을때는, 각 행과 열끼리 따로 곱해진다. (브로드 캐스팅)

 

 

두 배열의 제곱 구하기

arr = np.array([1,2,3])
arr1 = np.array([4,5,6])
arr ** arr1
>> array([  1,  32, 729])

 

 

인덱싱과 슬라이싱

데이터에 좀더 쉽게 접근하기 위하여 인덱싱과 슬라이싱을 사용한다.

이때 배열은 리스트 처럼 접근할 수 있다.

 

 

인덱싱

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

 

★[]를 사용하여 각각의 차원을 따로 불러야함.

 

 

슬라이싱

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

 

★슬라이스로 값을 지정할때는 , n1 부터 n2까지 이기때문에 2,3,4 가 나오게 된다.

 

 

다차원 에서의 인덱싱

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

 

 

다차원 에서의 슬라이싱

arr = np.array([1, 2, 3, 4, 5, 6])
arr = arr.reshape((3,2))
slice_arr = arr[:2, :2]
slice_arr
>> array([[1, 2],
        [3, 4]])
arr = np.array([1, 2, 3, 4, 5, 6])
arr = arr.reshape((3,2))
slice_arr = arr[:1, :2]
slice_arr
>> array([[1, 2]])

 

두개의 예시로 좀더 이해가 쉽게 하겠다.

[1:3] 인 경우에는 0을 제외하고 1, 2 의 인덱스
[:3] 인 경우게는 0을 포함한 0, 1, 2 의 인덱스를 반환한다.

 

 

 

브로드캐스팅

브로드 캐스팅은 차원이 다르거나 크기가 다른 배열 간의 연산을 하게 해준다.

이로인하여, 배열간의 연산을 매우 효율적으로 수행 할 수 있다.

 

브로드캐스팅이 가능한 조건

  1. 두 배열의 차원의 크기 같거나 작은 배열의 차원의 크기가 1이어야 한다.
  2. 각 차원에서의 크기가 동일하거나 한 배열에서 해당 차원의 크기가 1이어야 한다.

 

예시

arr = np.array([[1,2],[3,4],[5,6]])
#arr1 = np.array([[10,10]])
arr1 = np.array([10,10])
arr * arr1
>>array([[10, 20],
         [30, 40],
         [50, 60]])
arr1 = np.array([[1,2],[3,4],[5,6]])
#arr2 = np.array([[10]])
arr2 = np.array([10])
arr1 * arr2
>> array([[10, 20],
          [30, 40],
          [50, 60]])

 

 

 

numpy 함수를 이용하기


더하기

np.add()

arr1 = np.array([1,2,3,4,5])
e_arr = np.empty_like(arr1)
np.add(arr1, 10, out = e_arr)
e_arr
>> array([11, 12, 13, 14, 15])

 

out 을 사용하여서 배열을 지정해서 값을 재할당 할 수 있다. 

기본적인 연산이면 기호를 사용하면 되고, 특정 기능이 필요하다면 함수를 사용 할 수 있다.

out을 사용하지 않아도 배열에 값을 할당하는 경우도 있다.

arr = np.array([1,2,3])
arr1 = np.array([4,5,6])
arr2 = np.array([1,2,3])
np.add(arr,arr1,arr2)
>> array([5, 7, 9])

arr2
>> array([5, 7, 9])

 

 

빼기

np.subtract

arr = np.array([1,2,3])
arr1 = np.array([4,5,6])
np.subtract(arr1, arr)
>> array([3, 3, 3])

 

 

곱하기

np.multiply

arr = np.array([1,2,3])
arr1 = np.array([4,5,6])
np.multiply(arr,arr1)
>> array([ 4, 10, 18])

 

 

나누기 (소수점 이하 버리기)

np.floor_divide

arr = np.array([1,2,3])
arr1 = np.array([4,5,6])
np.floor_divide(arr1,arr)
>> array([4, 2, 2])

 

★ 이때, 배열의 데이터 타입은 float이 아닌 int이다.

 

 

나머지 구하기

np.mod

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

 

 

곱하기(배열내에서)

np.prod

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

 

 

누적합 구하기

np.cumsum

arr = np.array([1,2,3,4,5])
np.cumsum(arr)
>> array([ 1,  3,  6, 10, 15])

 

★누적합이란, 앞 인덱스의 모든 값을 더한다는 뜻이다. 

 

 

중간값 구하기

np.median

arr = np.array([[1, 2],[3, 4],[5, 6]])
np.median(arr)
>> 3.5

 

 

표준편차 구하기

np.std

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

 

 

분산 구하기

np.var

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

 

 

값의 위치 찾기

np.argmin / np.argmax

이는 최소값 또는 최대값을 구할때, 이 값이 몇번째에 있는지 확인하기 위해서 사용한다.

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

np.argmax(arr)
>> 4

 

 

최대값과 최소값의 범주 구하기

np.ptp

arr = np.array([1,2,3,4,100])
np.ptp(arr)
>> 99

 

★사실상 최소값과 최대값의 뺄셈이다.

저작자표시 비영리 변경금지

'용어정리 > Python-Library' 카테고리의 다른 글

python-library 용어정리 (pandas - 파일 불러오기)  (0) 2024.10.13
python-library 용어정리 (pandas - 시리즈와 데이터프레임)  (0) 2024.10.10
'용어정리/Python-Library' 카테고리의 다른 글
  • python-library 용어정리 (pandas - 파일 불러오기)
  • python-library 용어정리 (pandas - 시리즈와 데이터프레임)
코드 유랑자 승열
코드 유랑자 승열
코드 유랑자 승열의 프로그래밍 일지를 남기는 공간입니다.
  • 코드 유랑자 승열
    승열의 프로그래밍 시네마
    코드 유랑자 승열
  • 전체
    오늘
    어제
  • 링크

    • 깃허브 보러가기
    • 링크드인 보러가기
    • 인스타그램 보러가기
    • 카테고리
      • 코딩테스트
        • BaekJoon
      • TIL and WIL
        • TIL
        • WIL
      • 주말스터디
      • 내일배움캠프
        • 사전캠프 강의 (SQL)
      • 용어정리
        • Python
        • Python-Library
        • Machine-Learning
        • Deep-Learning
        • AI 활용
        • LLM & RAG
        • Docker
        • Django
        • SQL
        • Java Script
        • etc
      • Daily 코드카타
        • SQL
        • Python 알고리즘
      • 임시저장
      • 보류
  • 태그

    word2vec
    langchain
    llm
    vector db
    View
    오블완
    django
    template
    티스토리챌린지
    RAG
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
코드 유랑자 승열
python-library 용어정리 (numpy)
상단으로

티스토리툴바