numpy에는 두 개의 “배열”이 있으며 X
is (m,n)
and y
is a vector(n,1)
사용
X*y
오류가 발생합니다
ValueError: operands could not be broadcast together with shapes (97,2) (2,1)
시는 (97,2)x(2,1)
명확하게 법적 매트릭스 작업을하고 나에게 주어야한다 (97,1)
벡터
편집하다:
나는 이것을 사용하여 수정 X.dot(y)
했지만 원래의 질문은 여전히 남아 있습니다.
답변
dot
행렬 곱셈이지만 *
다른 일을합니다.
두 개의 배열이 있습니다.
X
, 모양 (97,2)y
, 모양 (2,1)
Numpy 배열을 사용하면
X * y
요소별로 수행되지만 값 중 하나 또는 둘 모두를 하나 이상의 차원으로 확장하여 호환되도록 할 수 있습니다. 이 작업을 브로드 캐스팅이라고합니다. 크기가 1이거나 누락 된 치수는 방송에 사용할 수 있습니다.
위의 예에서 치수는 다음과 같은 이유로 호환되지 않습니다.
97 2
2 1
여기에 첫 번째 차원 (97과 2)에 충돌하는 숫자가 있습니다. 그것이 위의 ValueError가 불평하는 것입니다. 두 번째 차원은 1 번이 어떤 것과도 충돌하지 않기 때문에 괜찮습니다.
브로드 캐스팅 규칙에 대한 자세한 정보 : http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html
( X
및 y
유형 numpy.matrix
이이면 별표를 행렬 곱셈으로 사용할 수 있습니다. 내 권장 사항은를 멀리 numpy.matrix
하는 것입니다. 단순화하는 것보다 더 복잡 해지는 경향이 있습니다.)
당신의 배열은 괜찮을 것입니다 numpy.dot
; 에서 오류가 발생 numpy.dot
하면 다른 버그가 있어야합니다. 에 대한 모양이 잘못된 경우 numpy.dot
다른 예외가 발생합니다.
ValueError: matrices are not aligned
이 오류가 계속 발생하면 문제에 대한 최소한의 예를 게시하십시오. 당신의 것과 같은 모양의 배열을 사용한 예제 곱셈이 성공합니다.
In [1]: import numpy
In [2]: numpy.dot(numpy.ones([97, 2]), numpy.ones([2, 1])).shape
Out[2]: (97, 1)
답변
numpy 문서 당 :
두 배열에서 작동 할 때 NumPy는 모양을 요소별로 비교합니다. 후행 치수에서 시작하여 앞으로 나아갑니다. 다음과 같은 경우 두 차원이 호환됩니다.
- 그들은 같거나
- 그들 중 하나는 1입니다
즉, 당신이 (선형 대수학 의미에서) 곱셈이 행렬에 시도하는 경우에 당신은 원하는 X.dot(y)
하지만 매트릭스에서 방송 스칼라하려고하는 경우 y
에 X
당신은 수행해야합니다 X * y.T
.
예:
>>> import numpy as np
>>>
>>> X = np.arange(8).reshape(4, 2)
>>> y = np.arange(2).reshape(1, 2) # create a 1x2 matrix
>>> X * y
array([[0,1],
[0,3],
[0,5],
[0,7]])
답변
내적에서 오류가 발생하지 않았지만 이후에 발생할 수 있습니다. 예를 들어 이것을 시도하십시오
a = np.random.randn(12,1)
b = np.random.randn(1,5)
c = np.random.randn(5,12)
d = np.dot(a,b) * c
np.dot (a, b)는 괜찮습니다. 그러나 np.dot (a, b) * c는 분명히 잘못되었지만 (12×1 X 1×5 = 12×5는 요소별로 5×12를 곱할 수 없습니다)하지만 numpy는
ValueError: operands could not be broadcast together with shapes (12,1) (1,5)
오해의 소지가있는 오류입니다. 그러나 그 라인에 문제가 있습니다.
답변
사용 np.mat(x) * np.mat(y)
하면 작동합니다.
답변
을 찾고 있습니다 np.matmul(X, y)
. Python 3.5 이상에서는 X @ y
.
답변
우리는 a * b가 내적이라는 것을 혼동 할 수 있습니다.
하지만 실은 방송입니다.
내적 : a.dot (b)
방송:
브로드 캐스팅이라는 용어는 산술 연산 중에 numpy가 다른 차원의 배열을 처리하여 특정 제약 조건을 초래하는 방법을 나타내며, 더 작은 배열은 호환되는 모양을 갖도록 더 큰 배열에 브로드 캐스트됩니다.
(m, n) +-/ * (1, n) → (m, n) : m 행에 적용됩니다.
답변
