dot
là phép nhân ma trận, nhưng *
thực hiện một cái gì đó khác.
Chúng tôi có hai mảng:
X
, hình dạng (97,2)
y
, hình dạng (2,1)
Với mảng Numpy, hoạt động
X * y
được thực hiện theo phần tử, nhưng một hoặc cả hai giá trị có thể được mở rộng theo một hoặc nhiều thứ nguyên để làm cho chúng tương thích. Hoạt động này được gọi là phát sóng. Các thứ nguyên có kích thước là 1 hoặc bị thiếu có thể được sử dụng trong phát sóng.
Trong ví dụ trên, các thứ nguyên không tương thích, bởi vì:
97 2
2 1
Ở đây có những con số mâu thuẫn trong chiều đầu tiên (97 và 2). Đó là những gì ValueError ở trên đang phàn nàn. Chiều thứ hai sẽ ổn, vì số 1 không mâu thuẫn với bất cứ thứ gì.
Để biết thêm thông tin về các quy tắc phát sóng: http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html
(Xin lưu ý rằng nếu X
và y
thuộc loại numpy.matrix
, thì dấu hoa thị có thể được sử dụng làm phép nhân ma trận. Khuyến nghị của tôi là nên tránh xa numpy.matrix
, nó có xu hướng phức tạp hơn là đơn giản hóa mọi thứ.)
Các mảng của bạn sẽ ổn numpy.dot
; nếu bạn gặp lỗi trên numpy.dot
, bạn phải có một số lỗi khác. Nếu hình dạng sai numpy.dot
, bạn sẽ có một ngoại lệ khác:
ValueError: matrices are not aligned
Nếu bạn vẫn gặp lỗi này, vui lòng đăng một ví dụ tối thiểu về sự cố. Một ví dụ về phép nhân với các mảng có hình dạng giống như của bạn sẽ thành công:
In [1]: import numpy
In [2]: numpy.dot(numpy.ones([97, 2]), numpy.ones([2, 1])).shape
Out[2]: (97, 1)
X*y
không nên hoạt động (và nó không), nhưngnp.dot(X,y)
vàX.dot(y))
sẽ hoạt động (và đối với tôi thì chúng làm vậy).