더북(TheBook)

먼저 y에 비어 있는 첫 번째 축을 추가하여 크기를 (1, 10)으로 만듭니다.

y = np.expand_dims(y, axis=0) ----- 이제 y의 크기는 (1, 10)입니다.

그런 다음 y를 이 축에 32번 반복하면 텐서 Y의 크기는 (32, 10)이 됩니다. 여기에서 Y[i, :] == y for i in range(0, 32)입니다.

Y = np.concatenate([y] * 32, axis=0) ----- 축 0을 따라 y를 32번 반복하여 크기가 (32, 10)인 Y를 얻습니다.

이제 XY의 크기가 같으므로 더할 수 있습니다.

구현 입장에서는 새로운 텐서가 만들어지면 매우 비효율적이므로 어떤 랭크-2 텐서도 만들어지지 않습니다. 반복된 연산은 완전히 가상적입니다. 이 과정은 메모리 수준이 아니라 알고리즘 수준에서 일어납니다. 하지만 새로운 축을 따라 벡터가 32번 반복된다고 생각하는 것이 이해하기 쉽습니다. 다음은 단순하게 구현한 예입니다.

def naive_add_matrix_and_vector(x, y):
    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는 넘파이 벡터입니다.

입력 텐서 자체를 바꾸지 않도록 복사합니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.