Numpy에서는 수학적 의미가 있는 행렬들을 함수로 제공한다.
# 단위행렬
np.eye(3)
>>> [[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
# 0 행렬
np.zeros([2,3])
>>> [[0. 0. 0.]
[0. 0. 0.]]
# 1행렬
np.ones([3,3])
>>> [[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]
broadcast 연산
A = np.arange(9).reshape(3,3)
A
>>> array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
# ndarray A에 2를 상수배 했을 때
A * 2
>>> array([[ 0, 2, 4],
[ 6, 8, 10],
[12, 14, 16]])
# ndarray A에 2를 더했을 때,
A + 2
>>> array([[ 2, 3, 4],
[ 5, 6, 7],
[ 8, 9, 10]])
# 3 X 3 행렬에 1 X 3 행렬을 더했을 때
A = np.arange(9).reshape(3,3)
B = np.array([1, 2, 3])
print("A:", A)
>>> A: [[0 1 2]
[3 4 5]
[6 7 8]]
print("B:", B)
>>> B: [1 2 3]
print("\nA+B:", A+B)
>>> A+B: [[ 1 3 5]
[ 4 6 8]
[ 7 9 11]]
# 3 X 3 행렬에 3 X 1 행렬을 더했을 때
A = np.arange(9).reshape(3,3)
C = np.array([[1], [2], [3]])
print("A:", A)
>>> A: [[0 1 2]
[3 4 5]
[6 7 8]]
print("C:", C)
>>> C: [[1]
[2]
[3]]
print("\nA+C:", A+C)
>>> A+C: [[ 1 2 3]
[ 5 6 7]
[ 9 10 11]]
# 3 X 3 행렬에 1 X 2 행렬을 더하는 것은 허용되지 않는다.
A = np.arange(9).reshape(3,3)
D = np.array([1, 2])
print("A:", A)
>>> A: [[0 1 2]
[3 4 5]
[6 7 8]]
print("D:", D)
>>> D: [1 2]
print("\nA+D:", A+D)
>>> ValueError: operands could not be broadcast together with shapes (3,3) (2,)
브로드캐스트 기능을 통해서 ndarray와 상수, 또는 서로 크기가 다른 ndarray끼리 산술연산을 할 수 있다.
공식 문서: https://numpy.org/devdocs/user/basics.broadcasting.html
# 오류 발생
print([1,2]+[3,4])
print([1,2]+3)
>>> TypeError: can only concatenate list (not "int") to list
# 브로드캐스팅
print(np.array([1,2])+np.array([3,4]))
print(np.array([1,2])+3)
>>> [4 6]
[4 5]