🤖

본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.

⚠️

본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.

이미지 로딩 중...

NumPy 기초: 배열과 연산 완벽 가이드 - 슬라이드 1/7
A

AI Generated

2025. 12. 1. · 14 Views

NumPy 기초: 배열과 연산 완벽 가이드

Python 데이터 과학의 핵심 라이브러리인 NumPy의 기초를 다룹니다. 배열 생성부터 인덱싱, 슬라이싱, 기본 연산까지 초급 개발자가 반드시 알아야 할 내용을 실무 예제와 함께 설명합니다.


목차

  1. NumPy_설치_및_import
  2. ndarray_생성_방법
  3. 배열_속성_shape_dtype
  4. 인덱싱과_슬라이싱
  5. 기본_연산_덧셈_곱셈
  6. 배열_생성_함수_zeros_ones_arange

1. NumPy 설치 및 import

김개발 씨는 데이터 분석 업무를 맡게 된 신입 개발자입니다. 첫 번째 과제로 대량의 숫자 데이터를 처리해야 하는데, Python의 기본 리스트로는 속도가 너무 느립니다.

선배 박시니어 씨가 다가와 말합니다. "NumPy 써봤어요?

데이터 처리할 때 필수예요."

NumPy는 Numerical Python의 약자로, Python에서 대규모 수치 연산을 빠르게 처리하기 위한 핵심 라이브러리입니다. 마치 일반 자동차와 스포츠카의 차이처럼, 기본 Python 리스트와 NumPy 배열은 성능 면에서 큰 차이를 보입니다.

NumPy를 익히면 데이터 과학, 머신러닝, 과학 계산 등 다양한 분야에서 효율적인 코드를 작성할 수 있습니다.

다음 코드를 살펴봅시다.

# NumPy 설치 (터미널에서 실행)
# pip install numpy

# NumPy 라이브러리 불러오기
import numpy as np

# 간단한 배열 생성으로 설치 확인
test_array = np.array([1, 2, 3, 4, 5])
print(test_array)  # [1 2 3 4 5]

# NumPy 버전 확인
print(np.__version__)  # 설치된 버전 출력

김개발 씨는 입사 첫 달에 큰 도전을 만났습니다. 회사에서 매일 수십만 건의 판매 데이터를 분석해야 하는 업무를 맡게 된 것입니다.

Python의 기본 리스트로 반복문을 돌려봤지만, 처리 시간이 너무 오래 걸렸습니다. "이 속도로는 퇴근이 불가능해요." 김개발 씨가 한숨을 쉬자, 옆자리 박시니어 씨가 모니터를 살펴봅니다.

"아, 아직 NumPy를 안 쓰고 있었군요. 데이터 다루는 개발자에게 NumPy는 필수예요." 그렇다면 NumPy란 정확히 무엇일까요?

NumPy는 Numerical Python의 줄임말로, 대규모 수치 연산에 특화된 라이브러리입니다. 쉽게 비유하자면, 일반 Python 리스트가 손으로 계산하는 주판이라면, NumPy는 고성능 전자계산기와 같습니다.

같은 계산이라도 속도와 효율성에서 엄청난 차이가 납니다. NumPy가 빠른 이유는 내부적으로 C 언어로 구현되어 있기 때문입니다.

Python의 유연함은 유지하면서, 실제 연산은 최적화된 C 코드가 처리합니다. 덕분에 순수 Python 코드보다 수십 배에서 수백 배 빠른 성능을 낼 수 있습니다.

설치는 매우 간단합니다. 터미널에서 pip install numpy 한 줄이면 됩니다.

설치가 완료되면 Python 코드에서 import numpy as np로 불러옵니다. 여기서 as np는 NumPy를 np라는 짧은 별칭으로 사용하겠다는 뜻입니다.

왜 굳이 별칭을 사용할까요? NumPy 함수는 코드 전반에 걸쳐 매우 자주 사용됩니다.

매번 numpy.array(), numpy.zeros()라고 적는 것보다 np.array(), np.zeros()가 훨씬 타이핑이 편하고 코드도 깔끔해집니다. 이 별칭은 전 세계 개발자들 사이에서 약속처럼 사용되는 관례입니다.

다른 사람의 코드를 읽을 때도 np를 보면 바로 NumPy구나 알 수 있습니다. 협업에서 이런 관례를 따르는 것은 매우 중요합니다.

설치 확인은 간단한 배열을 만들어보면 됩니다. np.array([1, 2, 3, 4, 5])로 배열을 생성하고 출력해봅니다.

에러 없이 배열이 출력되면 설치가 정상적으로 완료된 것입니다. 박시니어 씨의 조언을 따라 NumPy를 설치한 김개발 씨는 놀라운 경험을 했습니다.

기존에 10분 걸리던 데이터 처리가 단 몇 초 만에 끝난 것입니다. "이게 바로 NumPy의 힘이에요." 박시니어 씨가 미소 지으며 말했습니다.

실전 팁

💡 - 가상환경에서 작업할 때는 해당 환경을 활성화한 후 설치하세요

  • Anaconda를 사용한다면 NumPy가 기본으로 포함되어 있습니다

2. ndarray 생성 방법

NumPy 설치를 마친 김개발 씨는 이제 본격적으로 배열을 만들어보려 합니다. "리스트랑 뭐가 다른 거죠?"라고 물었더니, 박시니어 씨가 웃으며 답합니다.

"직접 만들어보면 차이를 바로 느낄 수 있을 거예요."

ndarray는 N-dimensional array의 약자로, NumPy의 핵심 자료구조입니다. Python 리스트와 달리 모든 요소가 동일한 타입이어야 하며, 이 덕분에 메모리를 효율적으로 사용하고 빠른 연산이 가능합니다.

np.array() 함수에 리스트를 전달하면 손쉽게 ndarray를 생성할 수 있습니다.

다음 코드를 살펴봅시다.

import numpy as np

# Python 리스트에서 1차원 배열 생성
arr_1d = np.array([1, 2, 3, 4, 5])
print(arr_1d)  # [1 2 3 4 5]

# 2차원 배열 생성 (행렬)
arr_2d = np.array([[1, 2, 3], [4, 5, 6]])
print(arr_2d)
# [[1 2 3]
#  [4 5 6]]

# 3차원 배열도 가능합니다
arr_3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print(arr_3d.ndim)  # 3 (차원 수 확인)

김개발 씨는 회사의 월별 매출 데이터를 정리하고 있었습니다. 처음에는 Python 리스트로 작업했습니다.

sales = [100, 150, 200, 180, 220]처럼요. 하지만 박시니어 씨는 이것을 NumPy 배열로 바꾸라고 권했습니다.

"리스트랑 똑같아 보이는데, 왜 굳이 바꿔야 하나요?" 김개발 씨의 질문에 박시니어 씨가 설명을 시작합니다. ndarray는 N-dimensional array, 즉 N차원 배열이라는 뜻입니다.

NumPy의 모든 기능은 이 ndarray를 중심으로 돌아갑니다. Python 리스트와 가장 큰 차이점은 동질성입니다.

ndarray의 모든 요소는 반드시 같은 데이터 타입이어야 합니다. 비유하자면, Python 리스트는 여러 종류의 물건을 담을 수 있는 가방입니다.

책, 노트북, 사과, 물병을 한꺼번에 넣을 수 있죠. 반면 ndarray는 같은 규격의 물건만 담는 정리함입니다.

이렇게 규격이 통일되면 정리도 쉽고, 꺼내 쓰기도 빠릅니다. 배열을 생성하는 가장 기본적인 방법은 np.array() 함수입니다.

기존의 Python 리스트를 인자로 전달하면 ndarray로 변환됩니다. arr = np.array([1, 2, 3, 4, 5])처럼 말이죠.

1차원 배열은 한 줄로 나열된 데이터입니다. 시간 순서대로 기록된 온도, 주가, 매출 같은 데이터가 이에 해당합니다.

일상에서 접하는 대부분의 단순 데이터는 1차원으로 표현할 수 있습니다. 2차원 배열은 행과 열로 이루어진 표 형태입니다.

엑셀 스프레드시트를 떠올리면 됩니다. arr_2d = np.array([[1, 2, 3], [4, 5, 6]])처럼 리스트 안에 리스트를 넣어 생성합니다.

첫 번째 리스트가 첫 번째 행, 두 번째 리스트가 두 번째 행이 됩니다. 3차원 이상의 배열도 가능합니다.

2차원 표가 여러 장 쌓인 모습을 상상해보세요. 이미지 데이터가 대표적입니다.

컬러 이미지는 높이, 너비, 색상 채널이라는 3개의 차원으로 이루어져 있습니다. 배열의 차원 수는 ndim 속성으로 확인할 수 있습니다.

arr.ndim을 출력하면 해당 배열이 몇 차원인지 알 수 있습니다. 이 정보는 데이터의 구조를 파악할 때 유용합니다.

김개발 씨는 매출 데이터를 ndarray로 변환했습니다. 그리고 지역별로 데이터를 정리해 2차원 배열로 만들었습니다.

서울, 부산, 대구의 월별 매출을 하나의 배열로 관리하니 훨씬 체계적이었습니다. "이제 좀 감이 오시죠?" 박시니어 씨가 물었습니다.

김개발 씨는 고개를 끄덕이며 다음 단계로 넘어갈 준비를 했습니다.

실전 팁

💡 - 리스트 안의 요소 타입이 다르면 NumPy가 자동으로 상위 타입으로 변환합니다

  • 배열 생성 시 dtype 매개변수로 데이터 타입을 명시적으로 지정할 수 있습니다

3. 배열 속성 shape dtype

김개발 씨는 선배가 작성한 코드를 분석하다가 arr.shape라는 부분을 발견했습니다. "이게 뭘 의미하는 거죠?" 박시니어 씨가 답합니다.

"배열의 신분증 같은 거예요. 이걸 알아야 배열을 제대로 다룰 수 있습니다."

NumPy 배열은 여러 가지 속성을 가지고 있으며, 그중 shapedtype이 가장 중요합니다. shape는 배열의 형태를 튜플로 나타내고, dtype은 요소의 데이터 타입을 알려줍니다.

이 속성들을 이해하면 배열의 구조를 정확히 파악하고 올바르게 연산할 수 있습니다.

다음 코드를 살펴봅시다.

import numpy as np

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

# shape: 배열의 형태 (행, 열)
print(arr.shape)  # (2, 3) - 2행 3열

# dtype: 데이터 타입
print(arr.dtype)  # int64

# ndim: 차원 수
print(arr.ndim)   # 2

# size: 전체 요소 개수
print(arr.size)   # 6

# 데이터 타입 지정하여 배열 생성
float_arr = np.array([1, 2, 3], dtype=np.float64)
print(float_arr.dtype)  # float64

김개발 씨는 다른 팀에서 전달받은 데이터를 처리해야 했습니다. 파일을 열어보니 NumPy 배열로 저장되어 있었는데, 이게 어떤 형태의 데이터인지 알 수가 없었습니다.

행이 몇 개고 열이 몇 개인지, 숫자인지 문자인지도 불분명했습니다. "이럴 때 배열의 속성을 확인하면 돼요." 박시니어 씨가 조언합니다.

"배열도 신분증이 있거든요." shape 속성은 배열의 형태를 알려줍니다. 마치 상자의 가로, 세로, 높이를 측정하는 것과 같습니다.

2차원 배열의 shape가 (2, 3)이라면 2행 3열의 배열이라는 뜻입니다. 3차원이라면 (2, 3, 4)처럼 세 개의 숫자가 나옵니다.

shape를 이해하는 것은 매우 중요합니다. 배열 간의 연산을 할 때 shape가 맞지 않으면 오류가 발생하기 때문입니다.

행렬 곱셈을 할 때 첫 번째 행렬의 열 수와 두 번째 행렬의 행 수가 같아야 하는 것처럼요. dtype은 배열 요소의 데이터 타입입니다.

int64는 64비트 정수, float64는 64비트 부동소수점을 의미합니다. NumPy는 다양한 데이터 타입을 지원하며, 적절한 타입을 선택하면 메모리를 절약할 수 있습니다.

예를 들어, 0부터 255 사이의 값만 저장한다면 int64 대신 uint8을 사용할 수 있습니다. 이미지 데이터가 대표적인 예입니다.

이렇게 하면 메모리 사용량을 8분의 1로 줄일 수 있습니다. ndim은 배열의 차원 수입니다.

1차원이면 1, 2차원이면 2를 반환합니다. shape의 길이와 같다고 생각하면 됩니다.

데이터의 복잡도를 빠르게 파악할 때 유용합니다. size는 배열의 전체 요소 개수입니다.

shape의 모든 값을 곱한 결과와 같습니다. (2, 3) shape의 배열이라면 size는 6입니다.

대용량 데이터를 다룰 때 메모리 사용량을 추정하는 데 활용됩니다. 배열을 생성할 때 dtype을 명시적으로 지정할 수도 있습니다.

np.array([1, 2, 3], dtype=np.float64)처럼 dtype 매개변수를 사용합니다. 정수 리스트도 실수 배열로 만들 수 있습니다.

김개발 씨는 전달받은 데이터의 속성을 확인해봤습니다. shape는 (1000, 50)이고 dtype은 float64였습니다.

"아, 1000개의 샘플이 있고 각 샘플은 50개의 특성을 가진 데이터군요!" 이제 어떻게 처리해야 할지 감이 잡혔습니다.

실전 팁

💡 - shape를 확인하는 습관을 들이면 배열 연산 오류를 미리 방지할 수 있습니다

  • astype() 메서드로 기존 배열의 dtype을 변환할 수 있습니다

4. 인덱싱과 슬라이싱

김개발 씨는 대량의 데이터에서 특정 부분만 추출해야 하는 상황입니다. "전체 데이터 중에서 첫 번째 행만, 또는 마지막 세 개 열만 가져오려면 어떻게 하죠?" 박시니어 씨가 답합니다.

"인덱싱과 슬라이싱을 배우면 원하는 데이터를 자유자재로 꺼낼 수 있어요."

인덱싱은 배열에서 특정 위치의 요소를 선택하는 것이고, 슬라이싱은 범위를 지정해 여러 요소를 한 번에 선택하는 것입니다. Python 리스트와 비슷하지만, NumPy는 다차원 배열에서도 쉽게 사용할 수 있도록 확장된 문법을 제공합니다.

콤마로 차원을 구분하여 직관적으로 데이터를 추출할 수 있습니다.

다음 코드를 살펴봅시다.

import numpy as np

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

# 기본 인덱싱: [행, 열]
print(arr[0, 0])    # 1 (첫 번째 행, 첫 번째 열)
print(arr[1, 2])    # 7 (두 번째 행, 세 번째 열)

# 슬라이싱: [시작:끝:간격]
print(arr[0, :])    # [1 2 3 4] (첫 번째 행 전체)
print(arr[:, 1])    # [2 6 10] (두 번째 열 전체)
print(arr[0:2, 1:3])  # 부분 행렬 추출
# [[2 3]
#  [6 7]]

# 음수 인덱싱
print(arr[-1, :])   # [9 10 11 12] (마지막 행)

김개발 씨는 고객 데이터를 분석하고 있었습니다. 1000명의 고객 정보가 담긴 2차원 배열에서 특정 고객의 데이터만 추출하거나, 특정 항목만 모아서 보고 싶었습니다.

하나하나 반복문을 돌리기엔 너무 비효율적이었습니다. "NumPy의 인덱싱과 슬라이싱을 쓰면 한 줄로 해결돼요." 박시니어 씨가 말합니다.

인덱싱은 도서관에서 책을 찾는 것과 같습니다. "3번 서가의 5번째 책"처럼 위치를 정확히 지정하면 원하는 책을 바로 찾을 수 있습니다.

NumPy에서는 arr[행, 열] 형태로 위치를 지정합니다. Python의 인덱스는 0부터 시작합니다.

따라서 arr[0, 0]은 첫 번째 행의 첫 번째 요소입니다. arr[1, 2]는 두 번째 행의 세 번째 요소가 됩니다.

이 규칙은 처음엔 헷갈리지만 금방 익숙해집니다. 슬라이싱은 책장에서 책 여러 권을 한 번에 꺼내는 것과 같습니다.

arr[0:3]은 인덱스 0부터 2까지, 즉 처음 세 개의 요소를 가져옵니다. 끝 인덱스는 포함되지 않는다는 점을 기억하세요.

콜론(:)은 특별한 의미를 가집니다. 시작이나 끝을 생략하면 처음부터 또는 끝까지를 의미합니다.

arr[:, 1]은 "모든 행의 두 번째 열"이라는 뜻입니다. 이렇게 하면 특정 열 전체를 쉽게 추출할 수 있습니다.

2차원 배열에서 부분 행렬을 추출하는 것도 가능합니다. arr[0:2, 1:3]은 0번과 1번 행에서 1번과 2번 열만 가져옵니다.

엑셀에서 특정 셀 범위를 드래그해서 선택하는 것과 비슷합니다. 음수 인덱싱도 지원합니다.

arr[-1]은 마지막 요소, arr[-2]는 끝에서 두 번째 요소입니다. 배열의 끝에서부터 접근할 때 유용합니다.

길이를 몰라도 마지막 요소를 쉽게 가져올 수 있습니다. 간격을 지정하는 것도 가능합니다.

arr[::2]는 처음부터 끝까지 2칸씩 건너뛰며 선택합니다. 홀수 번째 또는 짝수 번째 요소만 추출할 때 활용합니다.

주의할 점이 있습니다. NumPy 슬라이싱은 **뷰(view)**를 반환합니다.

원본 데이터를 복사하는 것이 아니라 참조합니다. 따라서 슬라이싱 결과를 수정하면 원본도 바뀝니다.

독립적인 복사본이 필요하다면 .copy() 메서드를 사용해야 합니다. 김개발 씨는 인덱싱과 슬라이싱을 활용해 필요한 데이터만 깔끔하게 추출했습니다.

반복문 없이 한 줄로 처리하니 코드도 간결해지고 실행 속도도 빨라졌습니다.

실전 팁

💡 - 슬라이싱 결과를 수정할 때는 원본에 영향을 주는지 항상 확인하세요

  • 조건부 인덱싱(arr[arr > 5])으로 조건에 맞는 요소만 선택할 수도 있습니다

5. 기본 연산 덧셈 곱셈

김개발 씨는 두 개의 배열을 더해야 하는 상황입니다. Python 리스트라면 반복문을 돌려야 하는데, NumPy는 다르다고 합니다.

"배열끼리 그냥 더하면 돼요?" 박시니어 씨가 웃으며 답합니다. "네, NumPy의 마법이죠.

벡터화 연산이라고 합니다."

NumPy의 벡터화 연산은 반복문 없이 배열 전체에 연산을 적용하는 기능입니다. 배열끼리 덧셈, 뺄셈, 곱셈, 나눗셈을 할 때 같은 위치의 요소끼리 자동으로 연산됩니다.

이를 **요소별 연산(element-wise operation)**이라고 합니다. 코드가 간결해지고 실행 속도도 훨씬 빨라집니다.

다음 코드를 살펴봅시다.

import numpy as np

a = np.array([1, 2, 3, 4])
b = np.array([10, 20, 30, 40])

# 요소별 덧셈
print(a + b)      # [11 22 33 44]

# 요소별 곱셈
print(a * b)      # [10 40 90 160]

# 스칼라 연산 (브로드캐스팅)
print(a * 2)      # [2 4 6 8]
print(a + 10)     # [11 12 13 14]

# 유니버설 함수
print(np.sqrt(a))  # [1.  1.41421356  1.73205081  2.]
print(np.sum(a))   # 10 (전체 합계)
print(np.mean(a))  # 2.5 (평균)

김개발 씨는 월별 매출 데이터와 비용 데이터를 가지고 있었습니다. 각 월의 순이익을 계산하려면 매출에서 비용을 빼야 합니다.

Python 리스트라면 반복문으로 하나씩 빼야 했을 것입니다. "NumPy에서는 그냥 빼면 돼요." 박시니어 씨가 말합니다.

벡터화 연산은 NumPy의 핵심 기능입니다. 배열 전체에 연산을 한 번에 적용하는 것입니다.

마치 마법처럼 반복문 없이도 모든 요소에 동시에 연산이 수행됩니다. 비유하자면, 일반 계산이 학생들에게 문제를 하나씩 나눠주고 한 명씩 채점하는 것이라면, 벡터화 연산은 OMR 카드를 기계로 한 번에 채점하는 것과 같습니다.

효율성의 차이가 엄청납니다. 두 배열을 더하면 같은 위치의 요소끼리 더해집니다.

a + b를 실행하면 a의 첫 번째 요소와 b의 첫 번째 요소가 더해지고, 두 번째끼리, 세 번째끼리 계속됩니다. 이를 요소별 연산이라고 합니다.

곱셈도 마찬가지입니다. a * b는 요소별 곱셈입니다.

행렬 곱셈이 아니라는 점에 주의하세요. 행렬 곱셈은 np.dot()이나 @ 연산자를 사용합니다.

이 차이는 매우 중요합니다. 브로드캐스팅이라는 기능도 있습니다.

배열과 단일 숫자(스칼라) 간의 연산입니다. a * 2를 실행하면 a의 모든 요소에 2가 곱해집니다.

NumPy가 자동으로 스칼라를 배열 크기에 맞게 확장해서 연산합니다. NumPy는 **유니버설 함수(ufunc)**라는 수학 함수들도 제공합니다.

np.sqrt()는 제곱근, np.exp()는 지수, np.log()는 로그를 계산합니다. 이 함수들도 배열 전체에 벡터화되어 적용됩니다.

집계 함수도 유용합니다. np.sum()은 전체 합계, np.mean()은 평균, np.max()와 np.min()은 최대값과 최소값을 반환합니다.

데이터 분석에서 가장 많이 사용하는 함수들입니다. 왜 벡터화 연산이 빠를까요?

반복문을 Python이 아닌 C 레벨에서 실행하기 때문입니다. Python 반복문은 매 반복마다 여러 오버헤드가 발생하지만, NumPy의 내부 반복문은 최적화된 기계어 수준에서 동작합니다.

실제로 성능 차이는 드라마틱합니다. 100만 개의 요소를 가진 배열에서 Python 반복문은 몇 초가 걸리지만, NumPy 벡터화 연산은 밀리초 단위로 끝납니다.

대용량 데이터를 다룰수록 이 차이는 더 벌어집니다. 김개발 씨는 매출 배열에서 비용 배열을 빼서 순이익을 계산했습니다.

profit = sales - costs 단 한 줄로요. "와, 진짜 간단하네요!" 코드도 깔끔하고 성능도 좋으니 일석이조입니다.

실전 팁

💡 - 배열 연산 전에 shape가 호환되는지 확인하세요

  • 행렬 곱셈이 필요하면 np.dot()이나 @ 연산자를 사용하세요

6. 배열 생성 함수 zeros ones arange

김개발 씨는 특정 패턴의 배열을 만들어야 했습니다. 모든 요소가 0인 배열, 1부터 100까지 숫자가 들어간 배열 등이요.

"이것도 일일이 리스트로 만들어야 하나요?" 박시니어 씨가 말합니다. "NumPy에는 편리한 배열 생성 함수들이 있어요."

NumPy는 다양한 배열 생성 함수를 제공합니다. zeros는 0으로 채워진 배열, ones는 1로 채워진 배열, arange는 일정 간격의 숫자로 채워진 배열을 생성합니다.

이 함수들을 활용하면 초기화 작업이나 테스트 데이터 생성이 훨씬 편리해집니다.

다음 코드를 살펴봅시다.

import numpy as np

# zeros: 0으로 채워진 배열
zeros_arr = np.zeros((3, 4))  # 3x4 배열
print(zeros_arr)

# ones: 1로 채워진 배열
ones_arr = np.ones((2, 3))
print(ones_arr)

# arange: 범위 지정 배열 (start, stop, step)
range_arr = np.arange(0, 10, 2)  # [0 2 4 6 8]
print(range_arr)

# linspace: 균등 간격 배열
linear_arr = np.linspace(0, 1, 5)  # [0. 0.25 0.5 0.75 1.]
print(linear_arr)

# eye: 단위 행렬
identity = np.eye(3)
print(identity)

김개발 씨는 머신러닝 모델을 구현하고 있었습니다. 가중치를 저장할 배열을 초기화해야 하는데, 모든 값을 0으로 시작해야 했습니다.

100x100 크기의 배열을 리스트로 만들려니 막막했습니다. "np.zeros() 하나면 끝나요." 박시니어 씨가 간단히 해결책을 제시합니다.

**np.zeros()**는 지정한 shape의 배열을 모두 0으로 채워서 생성합니다. np.zeros((3, 4))는 3행 4열의 배열을 만들고 모든 요소를 0으로 초기화합니다.

괄호 안에 튜플로 shape를 전달하는 것에 주의하세요. 비유하자면, zeros는 빈 노트를 준비하는 것과 같습니다.

모든 칸이 비어있는(0인) 상태에서 시작합니다. 나중에 필요한 값을 채워 넣으면 됩니다.

배열 초기화에 가장 많이 사용되는 함수입니다. **np.ones()**는 모든 요소를 1로 채웁니다.

가중치를 1로 초기화하거나, 마스크 배열을 만들 때 유용합니다. zeros와 사용법이 동일하며, shape를 튜플로 전달합니다.

특정 값으로 채우고 싶다면 **np.full()**을 사용합니다. np.full((2, 3), 7)은 2x3 배열을 모두 7로 채웁니다.

zeros나 ones로 만든 후 곱하는 것보다 직관적입니다. **np.arange()**는 Python의 range()와 비슷합니다.

시작값, 끝값, 간격을 지정하면 해당 범위의 숫자로 배열을 생성합니다. np.arange(0, 10, 2)는 0부터 10 미만까지 2씩 증가하는 배열 [0, 2, 4, 6, 8]을 만듭니다.

range()와의 차이점은 실수도 지원한다는 것입니다. np.arange(0, 1, 0.1)처럼 소수점 간격도 가능합니다.

하지만 부동소수점 오차 때문에 예상과 다른 결과가 나올 수 있어 주의가 필요합니다. 이런 문제를 해결하기 위해 **np.linspace()**가 있습니다.

시작값, 끝값, 개수를 지정하면 균등한 간격으로 나눕니다. np.linspace(0, 1, 5)는 0과 1 사이를 5등분한 [0, 0.25, 0.5, 0.75, 1]을 반환합니다.

끝값이 포함된다는 점이 arange와 다릅니다. **np.eye()**는 단위 행렬을 생성합니다.

대각선만 1이고 나머지는 0인 정사각 행렬입니다. 선형대수 연산에서 자주 사용됩니다.

np.eye(3)은 3x3 단위 행렬을 만듭니다. 랜덤 배열이 필요할 때는 np.random 모듈을 사용합니다.

np.random.rand(3, 4)는 0과 1 사이의 균등 분포 난수로 채운 3x4 배열을 생성합니다. 테스트 데이터를 만들거나 초기 가중치를 설정할 때 유용합니다.

김개발 씨는 np.zeros()로 가중치 배열을 초기화하고, np.arange()로 인덱스 배열을 만들었습니다. 예전 같으면 복잡한 반복문을 작성했을 텐데, NumPy 함수 하나로 해결되니 개발 속도가 훨씬 빨라졌습니다.

실전 팁

💡 - linspace는 끝값이 포함되고, arange는 포함되지 않습니다

  • 대용량 배열을 생성할 때는 dtype을 명시하여 메모리를 절약하세요

이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!

#Python#NumPy#ndarray#배열연산#데이터과학#Python,NumPy

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.