python numpy ValueError: 피연산자를 셰이프와 함께 브로드캐스트할 수 없습니다.
바보 같은 말로, 나는 두 개의 "배열"을 가지고 있습니다.X
이라(m,n)
그리고.y
는 벡터입니다.(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는 요소별로 모양을 비교합니다.이것은 후행 치수에서 시작하여 앞으로 작동합니다.다음과 같은 경우 2차원이 호환됩니다.
- 그들은 같거나, 또는.
- 그 중 하나는 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]])
찾으시는 제품은np.matmul(X, y)
Python 3.5+에서 사용할 수 있습니다.X @ y
.
도트 제품에 오류가 발생한 것이 아니라 그 이후에 발생했을 가능성이 있습니다.예를 들어 이것을 시도합니다.
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
틀렸습니다.12x1 X 1x5 = 12x5
로 요별로곱수없는할소를 곱할 수 것.5x12
에게 numpy를 줄 입니다.
ValueError: operands could not be broadcast together with shapes (12,1) (1,5)
오류가 오해의 소지가 있지만 해당 라인에 문제가 있습니다.
사용하다np.mat(x) * np.mat(y)
그거면 되겠군요.
우리는 *b가 점 제품이라는 것을 혼동할 수 있습니다.
하지만 사실, 그것은 방송됩니다.
도트 상품 : a.dot(b)
브로드캐스트:
브로드캐스팅이라는 용어는 산술 연산 중에 numpy가 차원이 다른 배열을 처리하여 특정 제약을 초래하는 방식을 말하며, 작은 배열은 호환 가능한 모양을 갖도록 더 큰 배열을 통해 브로드캐스팅됩니다.
(m,n) +-/* (1,n) → (m,n) : 연산이 행에 적용됩니다.
배열을 행렬로 변환한 다음 곱셈을 수행합니다.
X = np.matrix(X)
y = np.matrix(y)
X*y
우리는 방송에 대한 두 가지 점을 고려해야 합니다.첫째: 무엇이 가능한지입니다.둘째: 얼마나 많은 가능한 일들이 뚱딴지에 의해 이루어지는지.
조금 헷갈릴 수도 있겠지만, 몇 가지 예를 들어 설명하겠습니다.
0 레벨부터 시작합니다.
두 개의 행렬이 있다고 가정합니다.첫 번째 행렬은 3차원(A 이름)이고 두 번째 행렬은 5차원(B 이름)입니다.numpy는 마지막/미행 차원을 일치시키려고 합니다. 그래서 numpy는 B의 처음 두 차원을 신경쓰지 않습니다. 그러면 numpy는 그들의 후행 차원을 서로 비교합니다. 그리고 만약 그들이 같거나 그들 중 하나가 1이라면, numpy는 "좋아. 너희 둘은 일치해."라고 말하고, 만약 이 조건들이 만족하지 않는다면, numpy는 "미안...내 일이 아니야!"라고 말할 것입니다.
그러나 비교는 분리 가능할 때 처리할 수 있는 방식으로 하는 것이 더 낫다고 말할 수 있다는 것을 알고 있습니다(4, 2 / 9, 3).전체 숫자로 복제/복제할 수 있다고 말할 수 있습니다(예외의 경우 2/3).그리고 저는 당신의 의견에 동의합니다. 그리고 이것이 제가 무엇이 가능한지와 무엇이 numpy의 능력인지 구별하면서 논의를 시작한 이유입니다.
이것은 X와 y가 동일한 유형이 아니기 때문입니다.예를 들어 X는 numpy 행렬이고 y는 numpy 배열입니다!
오류: 피연산자를 도형(2,3)(2,3,3)과 함께 브로드캐스트할 수 없습니다.
이러한 오류는 두 배열의 모양이 동일하지 않을 때 발생합니다.
이 문제를 해결하려면 한 배열을 다른 배열과 일치하도록 재구성해야 합니다.
아래 예제 참조
a1 = array([1, 2, 3])
,shape = (2,3)
a3 =array([[[1., 2., 3.],
[2., 3., 2.],
[2., 4., 5.]],
[[1., 0., 3.],
[2., 3., 7.],
[2., 4., 6.]]])
with shape = (2,3,3)
내가 뛰려고 하면,np.multiply(a2,a3)
됩니다.
오류: 피연산자를 도형(2,3)(2,3,3)과 함께 브로드캐스트할 수 없습니다.
이 문제를 해결하기 위해 방송 규칙을 확인합니다.
which state hat Two dimensions are compatible when:
#1.they are equal, or
#2.one of them is 1`
따라서 a2의 모양을 다시 만들어 보겠습니다.
reshaped = a2.reshape(2,3,1)
이제달요세보를 실행해 .np.multiply(reshaped,a3)
곱셈이 성공적으로 실행됩니다!!
ValueError: operands could not be broadcast together with shapes (x ,y) (a ,b)
여기서 x,y는 변수입니다.
기본적으로 이 오류는 y 값(열 수)이 다른 다차원 배열의 요소 수와 같지 않을 때 발생합니다.
이제 ex=> 코딩으로 구분해 보겠습니다.
import numpy as np
arr1= np.arange(12).reshape(3,
arr1의 출력
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
arr2= np.arange(4).reshape(1,4)
또는 (둘 다 동일한 1행 및 4열)
arr2= np.arange(4)
arr2 출력=>
array([0, 1, 2, 3])
arr2의 요소 수가 arr1의 열 수와 같습니다. 이것은 절단될 것입니다.
for x,y in np.nditer([a,b]):
print(x,y)
출력 =>
0 0
1 1
2 2
3 3
4 0
5 1
6 2
7 3
8 0
9 1
10 2
11 3
언급URL : https://stackoverflow.com/questions/24560298/python-numpy-valueerror-operands-could-not-be-broadcast-together-with-shapes
'programing' 카테고리의 다른 글
Android View의 위쪽과 아래쪽에 테두리를 쉽게 추가할 수 있는 방법이 있습니까? (0) | 2023.06.06 |
---|---|
javascript에서 Firebase fire store에 저장하기 위한 날짜를 타임스탬프로 변환 (0) | 2023.06.06 |
UITableView에서 데이터 요청이 완료되면 알림을 받으시겠습니까? (0) | 2023.06.06 |
조건에 따라 목록을 분할(분할, 분할)하려면 어떻게 해야 합니까? (0) | 2023.06.06 |
Python에서 소스 파일 이름과 줄 번호를 기록하는 방법 (0) | 2023.06.06 |