먼저 y에 비어 있는 첫 번째 축을 추가하여 크기를 (1, 10)으로 만듭니다.
0) ----- 이제 y의 크기는 (1, 10)입니다.
= np.expand_dims(y, =그런 다음 y를 이 축에 32번 반복하면 텐서 Y의 크기는 (32, 10)이 됩니다. 여기에서 Y[i, :] == y for i in range(0, 32)입니다.
32, =0) ----- 축 0을 따라 y를 32번 반복하여 크기가 (32, 10)인 Y를 얻습니다.
= np.concatenate([y] *이제 X와 Y의 크기가 같으므로 더할 수 있습니다.
구현 입장에서는 새로운 텐서가 만들어지면 매우 비효율적이므로 어떤 랭크-2 텐서도 만들어지지 않습니다. 반복된 연산은 완전히 가상적입니다. 이 과정은 메모리 수준이 아니라 알고리즘 수준에서 일어납니다. 하지만 새로운 축을 따라 벡터가 32번 반복된다고 생각하는 것이 이해하기 쉽습니다. 다음은 단순하게 구현한 예입니다.
def naive_add_matrix_and_vector( , ): assert len(x.shape) == 2 ➊ assert len(y.shape) == 1 ➋ assert x.shape[1] == y.shape[0] x = x.copy() ➌ for i in range(x.shape[0]): for j in range(x.shape[1]): x[i, j] += y[j] return x
➊ x는 랭크-2 넘파이 배열입니다.
➋ y는 넘파이 벡터입니다.
➌ 입력 텐서 자체를 바꾸지 않도록 복사합니다.