Làm thế nào để có được phép nhân ma trận khôn ngoan nguyên tố (tích Hadamard) trong numpy?


102

Tôi có hai ma trận

a = np.matrix([[1,2], [3,4]])
b = np.matrix([[5,6], [7,8]])

và tôi muốn có được sản phẩm khôn ngoan [[1*5,2*6], [3*7,4*8]], bằng

[[5,12], [21,32]]

Tôi đã thử

print(np.dot(a,b)) 

print(a*b)

nhưng cả hai đều cho kết quả

[[19 22], [43 50]]

là sản phẩm ma trận, không phải là sản phẩm khôn ngoan. Làm cách nào để có được sản phẩm thông minh (còn gọi là sản phẩm Hadamard) bằng các chức năng tích hợp sẵn?


4
Bạn có chắc abkhông phải kiểu ma trận của NumPy? Với lớp này, *trả về sản phẩm bên trong, không trả về phần tử. Nhưng đối với ndarraylớp thông thường , *có nghĩa là sản phẩm khôn ngoan.
bnaecker

abmảng không? Ngoài ra, trong câu hỏi của bạn ở trên, bạn đang sử dụng xand yfor computation thay vì aand b. Đó chỉ là lỗi đánh máy?
jtitusj

a và b là những yếu tố loại ma trận NumPy
Malintha

8
Luôn sử dụng các mảng không phức tạp, chứ không phải các ma trận không phức tạp. Hãy xem các tài liệu numpy nói gì về điều này. Cũng xin lưu ý rằng từ python 3.5+, bạn có thể sử dụng @để nhân ma trận với các mảng nhiều mảng, có nghĩa là hoàn toàn không có lý do chính đáng để sử dụng ma trận trên mảng.
Praveen

3
Cầu kỳ ablà danh sách. Họ sẽ làm việc trong np.dot; nhưng không vào a*b. Nếu bạn sử dụng np.array(a)hoặc np.matrix(a), *hoạt động nhưng với kết quả khác.
hpaulj

Câu trả lời:


154

Để nhân từng phần tử của matrixcác đối tượng, bạn có thể sử dụng numpy.multiply:

import numpy as np
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
np.multiply(a,b)

Kết quả

array([[ 5, 12],
       [21, 32]])

Tuy nhiên, bạn thực sự nên sử dụng arraythay vì matrix. matrixcác đối tượng có đủ loại điểm không tương thích khủng khiếp với ndarrays thông thường. Với ndarrays, bạn chỉ có thể sử dụng *để nhân từng phần tử:

a * b

Nếu bạn đang sử dụng Python 3.5+, bạn thậm chí không mất khả năng thực hiện phép nhân ma trận với một toán tử, vì @phép nhân ma trận bây giờ :

a @ b  # matrix multiplication

11
Chỉ cần thêm một chút ngữ cảnh: trong Đại số, phép toán này được gọi là Sản phẩm Hadamard , và nó khác với sản phẩm ma trận phổ biến hơn. vi.wikipedia.org/wiki/Hadamard_product_(matrices)
FaCoffee

36

chỉ cần làm điều này:

import numpy as np

a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])

a * b

1
nop, nó cho phép nhân ma trận. Đám mây giải quyết nó bằng cách sử numpy.multiply
Malintha

2
Bạn đang sử dụng phiên bản Python và phiên bản nhỏ nào? Và của numpy?
smci

1
Sử dụng Intel Python 3.5.2 với numpy 1.12.1, *toán tử dường như thực hiện phép nhân khôn ngoan phần tử.
apnorton

1
Điều này cũng phù hợp với tôi với Numpy 1.12.1 trên Python 3.5.2 (được xây dựng bằng gcc).
Autodidact

6
@Malintha, tôi nghĩ bạn đang làm ma trận = np. ** ** ([[1,2], [3,4]])) thay vào đó
SeF 30/07/17

11
import numpy as np
x = np.array([[1,2,3], [4,5,6]])
y = np.array([[-1, 2, 0], [-2, 5, 1]])

x*y
Out: 
array([[-1,  4,  0],
       [-8, 25,  6]])

%timeit x*y
1000000 loops, best of 3: 421 ns per loop

np.multiply(x,y)
Out: 
array([[-1,  4,  0],
       [-8, 25,  6]])

%timeit np.multiply(x, y)
1000000 loops, best of 3: 457 ns per loop

Cả hai np.multiply*sẽ mang lại phép nhân khôn ngoan phần tử được gọi là Sản phẩm Hadamard

%timeit ipython có phải là phép thuật không


1

Thử cái này:

a = np.matrix([[1,2], [3,4]])
b = np.matrix([[5,6], [7,8]])

#This would result a 'numpy.ndarray'
result = np.array(a) * np.array(b)

Ở đây, np.array(a)trả về kiểu mảng 2D ndarrayvà phép nhân hai ndarraysẽ dẫn đến phép nhân khôn ngoan phần tử. Vì vậy, kết quả sẽ là:

result = [[5, 12], [21, 32]]

Nếu bạn muốn có một ma trận, hãy thực hiện với điều này:

result = np.mat(result)

Vui lòng giải thích điều này làm gì.
Leopold Joy

2
@LeopoldJoy Tôi vừa mới chỉnh sửa câu trả lời của tôi, hy vọng điều này sẽ giúp :))
Amir Rezazadeh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.