Python/Text Mining

Ch04.데이터 분석 기초 I - Numpy

jsBae 2025. 1. 16. 19:35

학습목표

- Numpy의 개념과 역할 이해
- 배열(Array) 생성 및 기본 연산
- 배열 조작 및 데이터 처리 방법 학습

"넘파이와 함께하는 데이터의 새로운 세계!“데이터 분석의 시작, 넘파이(Numpy)와 함께 효율적이고 강력한 배열 연산을 배워보자!


1. Numpy 소개

Numpy( Numerical Python. )란 무엇인가?

  • 2005년 Travis Oliphant에 의해 개발됨.
  • Python에서 과학적 계산을 위한 라이브러리, 오픈소스: 무료로 사용할 수 있는 오픈소스 프로젝트.
  • 고성능 다차원 배열 객체 제공

왜 사용하는가?

  • 속도와 효율성: Numpy 배열은 일반적인 Python 리스트보다 최대 50배 빠름.
  • 데이터 분석 및 머신러닝에 필수적임 : 속도와 자원이 중요한 데이터 분석에서 필수 도구.

넘파이 설치

pip install numpy

NumPy가 설치되면 다음 키워드를 추가하여 애플리케이션에 가져옵니다

import numpy

NumPy 버전 확인 : 버전 문자열은 __version__ 속성 아래에 저장됩니다.

import numpy as np

print(np.__version__)

이제 NumPy를 가져와서 사용할 준비가 되었습니다.

import numpy

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

print(arr)

참고사이트

https://numpy.org/?utm_source=chatgpt.com

 

NumPy -

Use the interactive shell to try NumPy in the browser

numpy.org

 

https://github.com/numpy/numpy

 

GitHub - numpy/numpy: The fundamental package for scientific computing with Python.

The fundamental package for scientific computing with Python. - numpy/numpy

github.com


2. Numpy 배열 생성 - array()

  • 기본 배열 생성 : NumPy의 배열 객체는 np.array.
  • NumPy는 일반적으로 np 별칭으로 가져옵니다. 이제 NumPy 패키지를 . np대신으로 지칭할 수 있습니다 
import numpy as np
# 1차원 배열
arr1 = np.array([1, 2, 3, 4])
print(arr1)
print(type(arr1))

# 2차원 배열
arr2 = np.array([[1, 2], [3, 4]])
print(arr2)

배열의 차원(Dimensions in Arrays)

  • 배열의 차원은 배열의 깊이, 즉 중첩된 배열의 단계를 의미합니다.
  • 차원이 증가할수록 배열의 구조가 더 복잡해지고, 데이터가 다차원적으로 구성됩니다.

다음은 배열의 차원과 예제를 표로 정리한 내용이다:

차원 설명 예제코드 결과
0차원 단일 값 (스칼라) python arr = np.array(42) 42
1차원 값의 리스트 (벡터) python arr = np.array([1, 2, 3, 4]) [1 2 3 4]
2차원 배열 안의 배열 (행렬) python arr = np.array([[1, 2], [3, 4]]) [[1 2] [3 4]]
3차원 2차원 배열의 집합 python arr = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) [[[1 2] [3 4]] [[5 6] [7 8]]]
n차원 다차원 배열 python arr = np.array([[[...]]]) (n번 중첩) n-1차원 배열들의 집합

중첩 배열이란?

  • 배열의 요소로 또 다른 배열을 포함하는 배열을 말합니다. 이를 통해 다차원 배열을 표현할 수 있습니다.
arr = np.array([[1, 2], [3, 4]])
print(arr)
# 출력:
# [[1 2]
#  [3 4]]

차원 확인 코드 : arr.ndim

import numpy as np

# 배열 생성
arr = np.array([1, 2, 3])
print("차원:", arr.ndim)
  • 1차원 배열: 값의 단순 리스트.
  • 2차원 배열: 행렬처럼 행과 열을 가지는 구조.
  • 3차원 이상: 다차원 데이터를 표현하기 위한 중첩 배열.
# 0으로 채워진 배열
zeros = np.zeros((2, 3))
print(zeros)

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

# 특정 범위의 숫자 생성
arange = np.arange(0, 10, 2)
print(arange)

# 랜덤 값 배열
random = np.random.rand(3, 3)
print(random)

3. 배열의 인덱싱

  • 인덱싱(Indexing): 배열의 특정 요소에 접근하기 위해 인덱스 번호를 사용하는 방법.
  • 인덱스 시작 번호: NumPy 배열의 인덱스는 0부터 시작.
    • 첫 번째 요소: 인덱스 0
    • 두 번째 요소: 인덱스 1
  • 1차원 배열 요소 접근
import numpy as np

# 1차원 배열 생성
arr = np.array([10, 20, 30, 40])

# 특정 요소 접근
print(arr[0])  # 첫 번째 요소: 10
print(arr[2])  # 세 번째 요소: 30
  • 2차원 배열 요소 접근
# 2차원 배열 생성
arr = np.array([[1, 2, 3], [4, 5, 6]])

# 특정 요소 접근
print(arr[0, 0])  # 첫 번째 행, 첫 번째 열: 1
print(arr[1, 2])  # 두 번째 행, 세 번째 열: 6
  • 3차원 배열 요소 접근
# 3차원 배열 생성
arr = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])

# 특정 요소 접근
print(arr[0, 1, 1])  # 첫 번째 배열, 두 번째 행, 두 번째 열: 4
print(arr[1, 0, 0])  # 두 번째 배열, 첫 번째 행, 첫 번째 열: 5

음수 인덱스: 뒤에서부터 요소를 참조할 수 있음.

arr = np.array([10, 20, 30])
print(arr[-1])  # 마지막 요소: 30

슬라이싱(Slicing): 배열에서 특정 범위의 요소를 추출하는 방법.

  • 형식: [start:end]
    • start: 슬라이스 시작 인덱스 (포함).
    • end: 슬라이스 끝 인덱스 (미포함).
    • step: 슬라이스의 간격.
import numpy as np

arr = np.array([10, 20, 30, 40, 50, 60])

# 기본 슬라이싱
print(arr[1:4])        # [20 30 40]
print(arr[:3])         # [10 20 30] (start 생략)
print(arr[3:])         # [40 50 60] (end 생략)
print(arr[::2])        # [10 30 50] (step 지정)
print(arr[::-1])       # [60 50 40 30 20 10] (역순)

슬라이싱 사용 시 주의점

  • end는 미포함: 슬라이스 범위는 start에서 시작하고 end-1까지 포함.

연습문제 1: 1차원 배열 인덱싱

import numpy as np

arr = np.array([5, 10, 15, 20, 25, 30])

 

  • 첫 번째 요소를 출력하시오.
  • 마지막 요소를 출력하시오.
  • 세 번째 요소를 출력하시오.

연습문제 2: 2차원 배열 인덱싱

arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
  • 첫 번째 행의 두 번째 요소를 출력하시오.
  • 두 번째 행의 마지막 요소를 출력하시오.
  • 세 번째 행 전체를 출력하시오.

연습문제 3: 1차원 배열 슬라이싱

arr = np.array([10, 20, 30, 40, 50, 60])
  • 인덱스 1부터 4까지의 요소를 출력하시오.
  • 첫 번째 요소부터 세 번째 요소까지 출력하시오.
  • 마지막 두 요소를 출력하시오.

연습문제 4: 2차원 배열 슬라이싱

arr = np.array([[10, 20, 30], [40, 50, 60], [70, 80, 90]])
  • 첫 번째 행과 두 번째 행을 슬라이싱하여 출력하시오.
  • 모든 행의 두 번째 열을 출력하시오.
  • 두 번째와 세 번째 행의 첫 번째와 두 번째 열을 출력하시오.

연습문제 5: 3차원 배열 인덱싱과 슬라이싱

arr = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
  • 첫 번째 배열의 첫 번째 행의 두 번째 요소를 출력하시오.
  • 두 번째 배열의 두 번째 행 전체를 출력하시오.
  • 첫 번째 배열의 모든 행과 첫 번째 열을 출력하시오.

♥ 배열의 구조를 이해하고 싶다면 shape와 ndim을 활용


4. 배열 기본 연산

산술 연산: NumPy 배열은 기본적인 산술 연산을 지원

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

print(arr1 + arr2)  # [5 7 9]
print(arr1 - arr2)  # [-3 -3 -3]
print(arr1 * arr2)  # [4 10 18]
print(arr1 / arr2)  # [0.25 0.4 0.5]

브로드캐스팅 (Broadcasting)

  • 배열 간의 크기가 다를 때 자동으로 크기를 맞춰 연산을 수행하는 기능.
  • 작은 배열이 큰 배열과의 연산에 맞게 확장됨.
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr + 10)  # 모든 원소에 10 추가

집계 연산

  • NumPy는 배열의 데이터를 집계하는 다양한 함수들을 제공한다.
arr = np.array([[1, 2, 3], [4, 5, 6]])

print(np.sum(arr))        # 배열의 모든 요소 합: 21
print(np.mean(arr))       # 평균: 3.5
print(np.max(arr))        # 최대값: 6
print(np.min(arr))        # 최소값: 1
print(np.std(arr))        # 표준편차: 1.707825127659933
print(np.var(arr))        # 분산: 2.9166666666666665

축(Axis)별 집계

print(np.sum(arr, axis=0))  # 열 방향 합: [5 7 9]
print(np.sum(arr, axis=1))  # 행 방향 합: [6 15]

논리 연산

배열의 요소별 비교 연산을 수행하거나, 논리적 조건을 만족하는 요소를 확인할 수 있음.

arr1 = np.array([1, 2, 3])
arr2 = np.array([3, 2, 1])

print(arr1 > arr2)  # [False False  True]
print(arr1 == arr2) # [False  True False]
arr = np.array([10, 20, 30, 40])

# 조건에 맞는 요소 선택
print(arr[arr > 20])  # [30 40]

선형대수 연산

NumPy는 행렬 곱, 전치, 역행렬 등 다양한 선형대수 연산을 지원한다.

mat1 = np.array([[1, 2], [3, 4]])
mat2 = np.array([[5, 6], [7, 8]])

# 행렬 곱
print(np.dot(mat1, mat2))  # [[19 22]
                           #  [43 50]]

# 전치 행렬
print(mat1.T)  # [[1 3]
               #  [2 4]]

5. 배열 조작

배열의 형태 변경 : arr.reshape()

  • NumPy의 reshape() 함수는 배열의 모양(Shape)을 변경하는 데 사용된다. 이를 통해 배열의 차원이나 구조를 유연하게 조정할 수 있다.
  • 제약 조건 : 새로운 모양의 전체 요소 수는 기존 배열의 요소 수와 같아야 한다
numpy.reshape(a, newshape, order='C')

매개변수

  1. a: 원본 배열.
  2. newshape: 변경하고자 하는 배열의 새로운 모양. 튜플 형식으로 전달.
    • 예: (rows, columns) 또는 다차원의 경우 (x, y, z)
  3. order: 데이터를 읽고 쓰는 순서. 기본값은 'C' (행 우선).
    • 'C': C 스타일 (행 우선).
    • 'F': Fortran 스타일 (열 우선).
arr = np.array([1, 2, 3, 4, 5, 6])
reshaped = arr.reshape((2, 3))
print(reshaped)
import numpy as np

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

# 1차원 -> 2차원 (2행 3열)
reshaped = arr.reshape(2, 3)
print(reshaped)
# 출력:
# [[1 2 3]
#  [4 5 6]]
  • 크기가 자동으로 설정되는 -1 사용
arr = np.array([1, 2, 3, 4, 5, 6])

# -1을 사용하여 자동 계산
reshaped = arr.reshape(3, -1)  # 3행, 자동 열 계산
print(reshaped)
# 출력:
# [[1 2]
#  [3 4]
#  [5 6]]
  • 에러 발생 경우 : 원본 배열 요소 수와 새로운 형태의 요소 수가 일치하지 않을 경우
arr = np.array([1, 2, 3, 4, 5])

# (2x3) 형태로 변경 시도 -> 에러 발생
reshaped = arr.reshape(2, 3)
# ValueError: cannot reshape array of size 5 into shape (2,3)

배열 합치기두 개 이상의 배열을 하나로 연결하는 과정

  • NumPy는 배열을 결합하는 다양한 방법을 제공하며, 배열의 축(Axis)을 기준으로 결합이 이루어진다
  • NumPy에서 배열 병합을 위한 주요 함수는 다음과 같다:

import numpy as np

arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])

# 행 방향 병합 (기본 axis=0)
result = np.concatenate((arr1, arr2))
print(result)
# 출력:
# [[1 2]
#  [3 4]
#  [5 6]
#  [7 8]]

# 열 방향 병합 (axis=1)
result = np.concatenate((arr1, arr2), axis=1)
print(result)
# 출력:
# [[1 2 5 6]
#  [3 4 7 8]]
import numpy as np

arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
arr = np.concatenate((arr1, arr2))
print(arr)
  • np.stack : 배열에 새로운 축을 추가하여 병합.
arr1 = np.array([1, 2])
arr2 = np.array([3, 4])

# 새로운 축 추가 (axis=0)
result = np.stack((arr1, arr2), axis=0)
print(result)
# 출력:
# [[1 2]
#  [3 4]]

# 새로운 축 추가 (axis=1)
result = np.stack((arr1, arr2), axis=1)
print(result)
# 출력:
# [[1 3]
#  [2 4]]
  • np.hstack (수평 병합) : 배열을 수평으로 연결. 동일한 행 개수가 필요.
  • np.vstack (수직 병합) : 배열을 수직으로 연결. 동일한 열 개수가 필요.
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])

# 수평 합치기
hstack = np.hstack((arr1, arr2))
print(hstack)

# 수직 합치기
vstack = np.vstack((arr1, arr2))
print(vstack)
  • np.dstack (깊이 방향 병합) : 2차원 배열을 깊이 방향(3차원)으로 병합.
arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])

result = np.dstack((arr1, arr2))
print(result)
# 출력:
# [[[1 5]
#   [2 6]]
#  [[3 7]
#   [4 8]]]
  • 주의 사항
    • 병합하려는 배열의 크기와 형상이 일치해야 한다.
    • np.stack은 새로운 축을 추가하기 때문에 차원을 명확히 이해해야 한다.
    • 각 함수는 축을 기준으로 동작하므로, 원하는 방향에 맞는 함수를 선택해야 한다.

배열 분할( Splitting NumPy Arrays)

  • NumPy 배열을 나누는 것은 하나의 배열을 여러 개의 하위 배열로 분리하는 작업을 의미한다.
  • Splitting은 데이터 전처리, 샘플링 또는 특정 데이터 추출에 유용하다.훈련 데이터와 테스트 데이터로 분리.
  • 훈련 데이터와 테스트 데이터로 분리 시 사용
  • NumPy에서 배열을 분할하기 위한 주요 함수는 다음과 같다:
함수 설명
np.split 배열을 균등하게 분할.
np.array_split 배열을 비균등하게 분할 가능.
np.hsplit 배열을 수평 방향(열)으로 분할.
np.vsplit 배열을 수직 방향(행)으로 분할.
np.dsplit 배열을 깊이 방향으로 분할(3차원 이상).

np.split

  • 배열을 균등하게 나눌 때 사용.
  • 분할하려는 배열의 길이가 분할 개수로 나누어 떨어져야 함.
import numpy as np

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

# 배열을 3개로 균등 분할
result = np.split(arr, 3)
print(result)
# 출력: [array([1, 2]), array([3, 4]), array([5, 6])]

np.array_split

  • 배열을 비균등하게 나눌 수 있음.
  • 균등하게 나눌 수 없는 경우, 마지막 배열이 더 적은 요소를 가질 수 있음.
arr = np.array([1, 2, 3, 4, 5])

# 배열을 3개로 비균등 분할
result = np.array_split(arr, 3)
print(result)
# 출력: [array([1, 2]), array([3, 4]), array([5])]

np.hsplit (수평 분할)

  • 배열을 열 단위로 분할.
  • 열의 개수분할 개수로 나누어 떨어져야 함.
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])

# 배열을 2개의 열로 분할
result = np.hsplit(arr, 2)
print(result)
# 출력:
# [array([[1, 2],
#         [5, 6]]),
#  array([[3, 4],
#         [7, 8]])]

np.vsplit (수직 분할)

  • 배열을 행 단위로 분할.
  • 행의 개수분할 개수로 나누어 떨어져야 함.
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 배열을 3개의 행으로 분할
result = np.vsplit(arr, 3)
print(result)
# 출력:
# [array([[1, 2, 3]]),
#  array([[4, 5, 6]]),
#  array([[7, 8, 9]])]

np.dsplit (깊이 분할)

  • 3차원 이상의 배열을 깊이 방향으로 분할.
  • 깊이 크기분할 개수로 나누어 떨어져야 함.
arr = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])

# 배열을 깊이 방향으로 2개로 분할
result = np.dsplit(arr, 2)
print(result)
# 출력:
# [array([[[1],
#          [3]],
#
#         [[5],
#          [7]]]),
#  array([[[2],
#          [4]],
#
#         [[6],
#          [8]]])]
  • 주의 사항
    • np.split과 np.array_split 차이: np.split은 균등하게 나누어야 하지만, np.array_split은 비균등 분할을 허용.
    • 분할 개수 조건: np.hsplit, np.vsplit, np.dsplit은 분할 축의 크기가 나누어떨어져야 함.

배열의 정렬

NumPy 배열의 정렬은 데이터를 오름차순 또는 원하는 기준에 따라 재배열하는 작업이다. NumPy는 정렬 작업을 수행하기 위해 np.sort 함수를 제공하며, 다양한 축(axis)과 데이터 유형에서 사용할 수 있다.

NumPy의 정렬 기능은 데이터 분석, 배열 조작, 순위 계산 등에 필수적이다.

  • 기본 정렬 : np.sort()는 배열의 요소를 오름차순으로 정렬한다.
import numpy as np

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

# 정렬
sorted_arr = np.sort(arr)
print(sorted_arr)
# 출력: [1 2 3 4 5]
  • 원본 배열은 변경되지 않고, 정렬된 배열을 반환.
  • 내림차순 정렬은 [::-1]로 반전 가능:
arr = np.array([3, 1, 4, 2])

# 내림차순 정렬
desc_sorted = np.sort(arr)[::-1]
print(desc_sorted)
# 출력: [4 3 2 1]
  • 다차원 배열 정렬 : 다차원 배열의 경우 **축(axis)**을 기준으로 정렬할 수 있다.
arr = np.array([[3, 2, 1], [6, 5, 4]])

# 각 행(row)별 정렬 (기본 axis=1)
sorted_by_row = np.sort(arr, axis=1)
print(sorted_by_row)
# 출력:
# [[1 2 3]
#  [4 5 6]]

# 각 열(column)별 정렬 (axis=0)
sorted_by_column = np.sort(arr, axis=0)
print(sorted_by_column)
# 출력:
# [[3 2 1]
#  [6 5 4]]
  • 구조화된 배열 정렬 : NumPy에서는 **구조화된 배열(Structured Array)**의 특정 필드를 기준으로 정렬할 수 있다.
data = np.array([(1, 'B'), (2, 'A'), (3, 'C')],
                dtype=[('id', int), ('name', 'U1')])

# 'name' 필드 기준 정렬
sorted_data = np.sort(data, order='name')
print(sorted_data)
# 출력:
# [(2, 'A') (1, 'B') (3, 'C')]
  • 내림차순 정렬 : NumPy는 직접적으로 내림차순 옵션을 제공하지 않으므로, 배열을 역순으로 반전하여 사용한다.

정렬 시 주의 사항

  1. 원본 배열 유지: np.sort는 원본 배열을 변경하지 않음.
    • 원본 배열을 직접 변경하려면 arr.sort() 사용.
  2. NaN 처리: NaN 값은 항상 배열의 끝에 배치됨.

6. 실습 예제

  • 평균과 표준편차 계산하기
data = np.array([10, 20, 30, 40, 50])
print("평균:", np.mean(data))
print("표준편차:", np.std(data))
  • 행렬 곱 계산
mat1 = np.array([[1, 2], [3, 4]])
mat2 = np.array([[5, 6], [7, 8]])

result = np.dot(mat1, mat2)
print(result)
  • 난수 생성
● random.random()은 균등 분포로 표본을 추출
● random.rand()는 균등 비율로 표본을 추출
● random.randn()은 정규 분포로 표본을 추출
#이 함수는 2x2 크기의 배열을 생성하며, 배열 안에는 0 이상 1 미만의 **난수(random number)**로 채워집니다.
d = np.random.random((2, 2))
d

np.random.normal은 정규 분포(Normal Distribution)를 따르는 난수를 생성하는 함수입니다.

e = np.random.normal(0, 2, (2, 3))
print(e)

연습문제 : NumPy 난수 생성

1. 0과 1 사이의 난수로 채워진 5x5 배열을 생성하세요.
2. 생성된 배열에서 모든 값이 0.5보다 큰 요소의 개수를 구하세요.
3. 평균(mean), 표준 편차(std), 최대값(max), 최소값(min)을 계산하세요.
# 1. 0과 1 사이 난수로 채워진 배열 생성
random_matrix = np.random.random((5, 5))
print("5x5 난수 배열:\n", random_matrix)

# 2. 0.5보다 큰 요소의 개수
count = np.sum(random_matrix > 0.5)
print("0.5보다 큰 값의 개수:", count)

# 3. 평균, 표준 편차, 최대값, 최소값 계산
print("평균값:", np.mean(random_matrix))
print("표준 편차:", np.std(random_matrix))
print("최대값:", np.max(random_matrix))
print("최소값:", np.min(random_matrix))

과제

  1. Numpy를 사용하여 5x5 크기의 랜덤 배열을 생성하고, 각 행의 평균을 구하시오.
  2. 3x3 배열 두 개를 생성하여 행렬 곱을 계산하시오.
  3. Numpy 배열의 슬라이싱을 이용하여 배열의 특정 부분을 추출하고, 이를 조작해보시오.
  4. NumPy 배열 생성 및 기본 연산
1. 길이가 10인 1차원 배열을 생성하고, 배열의 모든 값을 5로 채우세요.
2. 에서 생성한 배열의 모든 요소에 2를 더하세요.
3. 0에서 20까지의 정수를 포함하는 1차원 배열을 생성하고, 2로 나누어 떨3. 어지는 값만 출력하세요

퀴즈

  • Numpy 라이브러리가 제공하는 주된 기능 중 하나는 무엇인가?
    1. 데이터 시각화 도구 제공
    2. 고성능 다차원 배열 및 수학적 연산 지원
    3. 웹 개발 프레임워크 제공
    4. 머신러닝 모델 빌드
  • 다음 코드를 실행하면 출력 결과는 무엇인가?
import numpy as np
arr = np.zeros((2, 3))
print(arr)
  1. [[0 0 0], [0 0 0]]
  2. [[0. 0. 0.], [0. 0. 0.]]
  3. [[None None None], [None None None]]
  4. 에러 발생
  • 다음 코드를 실행하면 출력 결과는 무엇인가?
    1. [11 12 13]
    2. [1 2 3 10]
    3. 에러 발생
    4. [10 10 10]
import numpy as np
arr = np.array([1, 2, 3])
print(arr + 10)
  • 아래 코드에서 배열 arr의 모양을 (2, 3)으로 변경하려고 한다. 올바른 코드는 무엇인가?
    1. arr.reshape(3, 2)
    2. arr.reshape((2, 3))
    3. arr.reshape([2, 3])
    4. arr.change_shape((2, 3))
arr = np.array([1, 2, 3, 4, 5, 6])
  • 다음 코드에서 result의 값은 무엇인가?
    1. [[6 8] [10 12]]
    2. [[5 6] [7 8]]
    3. [[1 2] [3 4] [5 6] [7 8]]
    4. 에러 발생
import numpy as np
arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])
result = arr1 + arr2
print(result)
728x90
반응형