[Python] NumPy: ValueError: operands could not be broadcast together 문제 ν•΄κ²°ν•˜κΈ°

Posted by

NumPyλŠ” νŒŒμ΄μ¬μ—μ„œ κ³Όν•™ 계산을 μœ„ν•΄ 널리 μ‚¬μš©λ˜λŠ” λΌμ΄λΈŒλŸ¬λ¦¬μ΄λ‹€. κ·ΈλŸ¬λ‚˜ 가끔 NumPyλ₯Ό μ‚¬μš©ν•  λ•Œ ValueError: operands could not be broadcast together 였λ₯˜λ₯Ό λ§ˆμ£Όν•  수 μžˆλ‹€. 이 ν¬μŠ€νŠΈμ—μ„œλŠ” 이 였λ₯˜κ°€ λ°œμƒν•˜λŠ” 원인과 이λ₯Ό ν•΄κ²°ν•˜λŠ” 방법에 λŒ€ν•΄ μ•Œμ•„λ³Ό μ˜ˆμ •μ΄λ‹€.

였λ₯˜μ˜ 원인

NumPy λ°°μ—΄ μ—°μ‚°μ—μ„œ ValueError: operands could not be broadcast together 였λ₯˜λŠ” 두 λ°°μ—΄μ˜ ν˜•νƒœ(shape)κ°€ μΌμΉ˜ν•˜μ§€ μ•Šμ„ λ•Œ λ°œμƒν•œλ‹€. NumPyλŠ” μžλ™μœΌλ‘œ 배열을 μΌμΉ˜μ‹œν‚€λ €κ³  μ‹œλ„(이λ₯Ό “λΈŒλ‘œλ“œμΊμŠ€νŒ…”이라고 λΆ€λ₯΄λ©°)ν•˜μ§€λ§Œ, λΈŒλ‘œλ“œμΊμŠ€νŒ… κ·œμΉ™μ— λ§žμ§€ μ•ŠλŠ” 경우 였λ₯˜κ°€ λ°œμƒν•œλ‹€.

예제 μ½”λ“œμ™€ 문제 λ°œμƒ

λ‹€μŒμ€ 이 였λ₯˜κ°€ λ°œμƒν•  수 μžˆλŠ” 예제 μ½”λ“œμ΄λ‹€:

import numpy as np

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

result = array1 + array2

μœ„μ˜ μ½”λ“œμ—μ„œ array1은 (2, 3)의 ν˜•νƒœλ₯Ό 가지고 있고, array2λŠ” (2,)의 ν˜•νƒœλ₯Ό 가지고 μžˆλ‹€. 두 λ°°μ—΄μ˜ ν˜•νƒœκ°€ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— λ”ν•˜κΈ° 연산을 μˆ˜ν–‰ν•  수 μ—†μ–΄μ„œ μ•„λž˜μ™€ 같이 였λ₯˜κ°€ λ°œμƒν•˜κ²Œ λœλ‹€.

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[6], line 6
      3 array1 = np.array([[1, 2, 3], [4, 5, 6]])
      4 array2 = np.array([1, 2])
----> 6 result = array1 + array2
      7 result

ValueError: operands could not be broadcast together with shapes (2,3) (2,) 

ν•΄κ²° 방법

λ°°μ—΄μ˜ ν˜•νƒœλ₯Ό λ§žμΆ”κΈ°

두 λ°°μ—΄μ˜ ν˜•νƒœλ₯Ό μΌμΉ˜μ‹œν‚€κΈ° μœ„ν•΄ 배열을 μž¬κ΅¬μ‘°ν™”ν•˜κ±°λ‚˜ ν™•μž₯ν•œλ‹€.

import numpy as np

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

array2 = np.array([[1], [2]])  # array2λ₯Ό (2, 1)으둜 λ³€κ²½
result = array1 + array2

print(result)

λΈŒλ‘œλ“œμΊμŠ€νŒ…μ„ μ΄μš©ν•˜κΈ°

λ°°μ—΄μ˜ 좕을 μΆ”κ°€ν•˜μ—¬ λΈŒλ‘œλ“œμΊμŠ€νŒ…μ΄ κ°€λŠ₯ν•˜λ„λ‘ ν•œλ‹€.

import numpy as np

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

array2 = array2[:, np.newaxis]  # array2λ₯Ό (2, 1)으둜 ν™•μž₯
result = array1 + array2

print(result)

μœ„ 두 μ½”λ“œμ—μ„œ array2λ₯Ό (2, 1) ν˜•νƒœλ‘œ λ³€ν™˜ν•¨μœΌλ‘œμ¨ array1과의 ν˜•νƒœκ°€ μΌμΉ˜ν•˜κ²Œ λ˜μ–΄ 연산이 μ„±κ³΅μ μœΌλ‘œ μˆ˜ν–‰λœλ‹€.

μΆ”κ°€ 예제: λΈŒλ‘œλ“œμΊμŠ€νŒ… κ·œμΉ™ μ΄ν•΄ν•˜κΈ°

λΈŒλ‘œλ“œμΊμŠ€νŒ… κ·œμΉ™μ„ 더 잘 μ΄ν•΄ν•˜κΈ° μœ„ν•΄ 또 λ‹€λ₯Έ 예제λ₯Ό μ‚΄νŽ΄λ³΄λ„λ‘ ν•˜μž.

import numpy as np

array1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
array2 = np.array([10, 20, 30])

result = array1 + array2

print(result)

μœ„μ˜ μ½”λ“œμ—μ„œ array1은 (3, 3)의 ν˜•νƒœλ₯Ό 가지고 있고, array2λŠ” (3,)의 ν˜•νƒœλ₯Ό 가지고 μžˆλ‹€. NumPyλŠ” array2의 ν˜•νƒœλ₯Ό μžλ™μœΌλ‘œ (1, 3)으둜 ν™•μž₯ν•˜μ—¬ array1과의 λ”ν•˜κΈ° 연산을 μˆ˜ν–‰ν•œλ‹€.

# result
[[11 22 33]
 [14 25 36]
 [17 28 39]]

λΈŒλ‘œλ“œμΊμŠ€νŒ… κ·œμΉ™

λΈŒλ‘œλ“œμΊμŠ€νŒ…μ΄ μ„±κ³΅ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ‹€μŒ κ·œμΉ™μ΄ μ μš©λ˜μ–΄μ•Ό ν•œλ‹€:

  1. λ°°μ—΄μ˜ 각 좕이 λ™μΌν•œ 크기λ₯Ό κ°€μ§€κ±°λ‚˜, ν•˜λ‚˜μ˜ λ°°μ—΄μ˜ 크기가 1이어야 ν•œλ‹€.
  2. λ°°μ—΄μ˜ 차원이 λ‹€λ₯΄λ©΄, μž‘μ€ λ°°μ—΄μ˜ μ•žμͺ½μ— 크기가 1인 좕이 μΆ”κ°€λœλ‹€.

μœ„ κ·œμΉ™μ„ 톡해 두 λ°°μ—΄μ˜ ν˜•νƒœκ°€ 일치되면, NumPyλŠ” μžλ™μœΌλ‘œ λΈŒλ‘œλ“œμΊμŠ€νŒ…μ„ μˆ˜ν–‰ν•˜μ—¬ 연산을 진행할 수 μžˆλ‹€.

κ²°λ‘ 

ValueError: operands could not be broadcast together 였λ₯˜λŠ” λ°°μ—΄μ˜ ν˜•νƒœκ°€ μΌμΉ˜ν•˜μ§€ μ•Šμ„ λ•Œ λ°œμƒν•œλ‹€. 이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ°°μ—΄μ˜ ν˜•νƒœλ₯Ό λ§žμΆ”κ±°λ‚˜, λΈŒλ‘œλ“œμΊμŠ€νŒ… κ·œμΉ™μ— 따라 배열을 μž¬κ΅¬μ„±ν•΄μ•Ό ν•œλ‹€. NumPy의 λΈŒλ‘œλ“œμΊμŠ€νŒ…μ„ μ΄ν•΄ν•˜κ³  ν™œμš©ν•˜λ©΄, λŒ€κ·œλͺ¨ 데이터 연산을 효율적으둜 μ²˜λ¦¬ν•  수 μžˆλ‹€.

Leave a Reply

이메일 μ£Όμ†ŒλŠ” κ³΅κ°œλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν•„μˆ˜ ν•„λ“œλŠ” *둜 ν‘œμ‹œλ©λ‹ˆλ‹€