두 텐서 중 하나라도 ndim이 1보다 크면 dot 연산에 교환 법칙이 성립되지 않습니다. 다시 말하면 dot(x, y)와 dot(y, x)가 같지 않습니다.21
물론 점곱은 임의의 축 개수를 가진 텐서에 일반화됩니다. 가장 일반적인 용도는 두 행렬 간의 점곱일 것입니다. x.shape[1] == y.shape[0]일 때 두 행렬 x와 y의 점곱(dot(x, y))이 성립됩니다. x의 행과 y의 열 사이 벡터 점곱으로 인해 (x.shape[0], y.shape[1]) 크기의 행렬이 됩니다. 다음은 단순한 구현 예입니다.
def naive_matrix_dot( , ): assert len(x.shape) == 2 ➊ assert len(y.shape) == 2 ➊ assert x.shape[1] == y.shape[0] ➋ z = np.zeros((x.shape[0], y.shape[1])) ➌ for i in range(x.shape[0]): ➍ for j in range(y.shape[1]): ➎ row_x = x[i, :] column_y = y[:, j] z[i, j] = naive_vector_dot(row_x, column_y) return z
➊ x와 y는 넘파이 벡터입니다.
➋ x의 두 번째 차원이 y의 첫 번째 차원과 같아야 합니다!
➌ 이 연산은 0이 채워진 특정 크기의 벡터를 만듭니다.
➍ x의 행을 반복합니다.
➎ y의 열을 반복합니다.