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인 축이 추가된다.
위 규칙을 통해 두 배열의 형태가 일치되면, NumPy는 자동으로 브로드캐스팅을 수행하여 연산을 진행할 수 있다.
결론
ValueError: operands could not be broadcast together 오류는 배열의 형태가 일치하지 않을 때 발생한다. 이 문제를 해결하기 위해서는 배열의 형태를 맞추거나, 브로드캐스팅 규칙에 따라 배열을 재구성해야 한다. NumPy의 브로드캐스팅을 이해하고 활용하면, 대규모 데이터 연산을 효율적으로 처리할 수 있다.