Xem thảo luận
Cải thiện bài viết
Lưu bài viết
Xem thảo luận
Cải thiện bài viết
Lưu bài viết
Đọc
- Bàn luận
- Nhân vector nhân có ba loại:
- Sản phẩm vô hướng
Sản phẩm chấm
Scalar multiplication can be represented by multiplying a scalar quantity by all the elements in the vector matrix.
Sản phẩm chéo
Nhân hóa vô hướng: Nhân vô hướng có thể được biểu diễn bằng cách nhân một lượng vô hướng với tất cả các phần tử trong ma trận vectơ.
Mã: Mã Python giải thích phép nhân vô hướng
40
41
40
43
40
45
[ 12 76 -61]8
[ 12 76 -61]9
>>> a = np.array[[[ 5, 1 ,3],
[ 1, 1 ,1],
[ 1, 2 ,1]]]
>>> b = np.array[[1, 2, 3]]
>>> print a.dot[b]
array[[16, 6, 8]]
0>>> a = np.array[[[ 5, 1 ,3],
[ 1, 1 ,1],
[ 1, 2 ,1]]]
>>> b = np.array[[1, 2, 3]]
>>> print a.dot[b]
array[[16, 6, 8]]
1>>> a = np.array[[[ 5, 1 ,3],
[ 1, 1 ,1],
[ 1, 2 ,1]]]
>>> b = np.array[[1, 2, 3]]
>>> print a.dot[b]
array[[16, 6, 8]]
247
>>> a = np.array[[[ 5, 1 ,3],
[ 1, 1 ,1],
[ 1, 2 ,1]]]
>>> b = np.array[[1, 2, 3]]
>>> print a.dot[b]
array[[16, 6, 8]]
4>>> a = np.array[[[ 5, 1 ,3],
[ 1, 1 ,1],
[ 1, 2 ,1]]]
>>> b = np.array[[1, 2, 3]]
>>> print a.dot[b]
array[[16, 6, 8]]
5>>> a = np.array[[[ 5, 1 ,3],
[ 1, 1 ,1],
[ 1, 2 ,1]]]
>>> b = np.array[[1, 2, 3]]
>>> print a.dot[b]
array[[16, 6, 8]]
6>>> a = np.array[[[ 5, 1 ,3],
[ 1, 1 ,1],
[ 1, 2 ,1]]]
>>> b = np.array[[1, 2, 3]]
>>> print a.dot[b]
array[[16, 6, 8]]
5>>> a = np.array[[[ 5, 1 ,3],
[ 1, 1 ,1],
[ 1, 2 ,1]]]
>>> b = np.array[[1, 2, 3]]
>>> print a.dot[b]
array[[16, 6, 8]]
8>>> a = np.array[[[ 5, 1 ,3],
[ 1, 1 ,1],
[ 1, 2 ,1]]]
>>> b = np.array[[1, 2, 3]]
>>> print a.dot[b]
array[[16, 6, 8]]
9>>> print[a @ b]
array[[16, 6, 8]]
047
>>> print[a @ b]
array[[16, 6, 8]]
2>>> print[a @ b]
array[[16, 6, 8]]
347
>>> print[a @ b]
array[[16, 6, 8]]
5>>> print[a @ b]
array[[16, 6, 8]]
6>>> print[a @ b]
array[[16, 6, 8]]
7>>> print[a @ b]
array[[16, 6, 8]]
847
[ 12 76 -61]9
>>> a = np.array[[[ 5, 1 ,3],
[ 1, 1 ,1],
[ 1, 2 ,1]]]
>>> b = np.array[[1, 2, 3]]
>>> print a.dot[b]
array[[16, 6, 8]]
5[ 12 76 -61]0
>>> a = np.array[[[ 5, 1 ,3],
[ 1, 1 ,1],
[ 1, 2 ,1]]]
>>> b = np.array[[1, 2, 3]]
>>> print a.dot[b]
array[[16, 6, 8]]
5>>> np.einsum['ji,i->j', a, b]
array[[16, 6, 8]]
446
47
48
49
[ 12 76 -61]0
[ 12 76 -61]1
[ 12 76 -61]2
>>> np.matmul[a, b]
array[[16, 6, 8]]
3[ 12 76 -61]
34
7 [ 12 76 -61]
5 [ 12 76 -61]
6 [ 12 76 -61]
7
w = [20 5]
5>>> np.einsum['ji,i->j', a, b]
array[[16, 6, 8]]
[ 12 76 -61]
6
7>>> np.einsum['ji,i->j', a, b]
array[[16, 6, 8]]
[ 12 76 -61]
6
9>>> np.einsum['ji,i->j', a, b]
array[[16, 6, 8]]
4
7
1>>> np.matmul[a, b]
array[[16, 6, 8]]
2>>> np.matmul[a, b]
array[[16, 6, 8]]
Đầu ra:
Nhân hóa vô hướng: Nhân vô hướng có thể được biểu diễn bằng cách nhân một lượng vô hướng với tất cả các phần tử trong ma trận vectơ.
40
41
40
43
40
45
46
47
48
49
[ 12 76 -61]0
[ 12 76 -61]1
[ 12 76 -61]2
[ 12 76 -61]8
>>> np.dot[np.dot[a, a.T], a].dot[a.T]
array[[[1406, 382, 446],
[ 382, 106, 126],
[ 446, 126, 152]]]
>>> np.linalg.multi_dot[[a, a.T, a, a.T]]
array[[[1406, 382, 446],
[ 382, 106, 126],
[ 446, 126, 152]]]
7[ 12 76 -61]3
47
[ 12 76 -61]5
[ 12 76 -61]6
[ 12 76 -61]7
5>>> np.einsum['ji,i->j', a, b] array[[16, 6, 8]]
[ 12 76 -61]67>>> np.einsum['ji,i->j', a, b] array[[16, 6, 8]]
[ 12 76 -61]69>>> np.einsum['ji,i->j', a, b] array[[16, 6, 8]]
471>>> np.matmul[a, b] array[[16, 6, 8]]
2>>> np.matmul[a, b] array[[16, 6, 8]]
[ 12 76 -61]
34
7 [ 12 76 -61]
5 [ 12 76 -61]
6 [ 12 76 -61]
7
4
5>>> np.einsum['ji,i->j', a, b]
array[[16, 6, 8]]
[ 12 76 -61]
6
7>>> np.einsum['ji,i->j', a, b]
array[[16, 6, 8]]
[ 12 76 -61]
6
9>>> np.einsum['ji,i->j', a, b]
array[[16, 6, 8]]
4
7
1>>> np.matmul[a, b]
array[[16, 6, 8]]
2>>> np.matmul[a, b]
array[[16, 6, 8]]
Đầu ra:
Nhân hóa vô hướng: Nhân vô hướng có thể được biểu diễn bằng cách nhân một lượng vô hướng với tất cả các phần tử trong ma trận vectơ.
40
41
40
43
40
45
46
47
48
49
[ 12 76 -61]0
[ 12 76 -61]1
[ 12 76 -61]2
[ 12 76 -61]8
414
Output:
[ 12 76 -61]
Giải pháp đơn giản nhất
Sử dụng
415 hoặc
416. Xem tài liệu ở đây.
>>> a = np.array[[[ 5, 1 ,3],
[ 1, 1 ,1],
[ 1, 2 ,1]]]
>>> b = np.array[[1, 2, 3]]
>>> print a.dot[b]
array[[16, 6, 8]]
Điều này xảy ra bởi vì các mảng numpy không phải là ma trận và các hoạt động tiêu chuẩn
417 phần tử công việc khôn ngoan trên các mảng.
Lưu ý rằng trong khi bạn có thể sử dụng
418 [tính đến đầu năm 2021] trong đó
[ 12 76 -61]6 sẽ được xử lý như phép nhân ma trận tiêu chuẩn,
418 không được chấp nhận và có thể bị xóa trong các bản phát hành trong tương lai .. Xem ghi chú trong tài liệu của nó [được sao chép dưới đây]:
418 is deprecated and may be removed in future releases.. See the note in its documentation [reproduced below]:
Nó không còn được khuyến nghị sử dụng lớp này, ngay cả đối với đại số tuyến tính. Thay vào đó sử dụng các mảng thông thường. Lớp học có thể được loại bỏ trong tương lai.
Cảm ơn @hopeking.
Các giải pháp khác
Cũng biết có những lựa chọn khác:
Như đã lưu ý dưới đây, nếu sử dụng Python3.5+ và Numpy V1.10+, toán tử
4
21 hoạt động như bạn mong đợi:>>> print[a @ b] array[[16, 6, 8]]
Nếu bạn muốn Overkill, bạn có thể sử dụng
4
22. Tài liệu sẽ cung cấp cho bạn một hương vị cho cách nó hoạt động, nhưng thành thật mà nói, tôi không hoàn toàn hiểu cách sử dụng nó cho đến khi đọc câu trả lời này và chỉ chơi xung quanh với nó.>>> np.einsum['ji,i->j', a, b] array[[16, 6, 8]]
Tính đến giữa năm 2016 [Numpy 1.10.1], bạn có thể thử thử nghiệm
4
23, hoạt động như4
15 với hai trường hợp ngoại lệ chính: không nhân hóa vô hướng nhưng nó hoạt động với các ngăn xếp ma trận.>>> np.matmul[a, b] array[[16, 6, 8]]
4
25 có chức năng tương tự như4
15 cho phép nhân vectơ ma trận nhưng hoạt động khác nhau đối với ma trận ma trận và phép nhân tenxơ [xem Wikipedia liên quan đến sự khác biệt giữa sản phẩm bên trong và sản phẩm DOT nói chung hoặc xem câu trả lời này về việc triển khai Numpy].for matrix-vector multiplication but behaves differently for matrix-matrix and tensor multiplication [see Wikipedia regarding the differences between the inner product and dot product in general or see this SO answer regarding numpy's implementations].>>> np.inner[a, b] array[[16, 6, 8]] # Beware using for matrix-matrix multiplication though! >>> b = a.T >>> np.dot[a, b] array[[[35, 9, 10], [ 9, 3, 4], [10, 4, 6]]] >>> np.inner[a, b] array[[[29, 12, 19], [ 7, 4, 5], [ 8, 5, 6]]]
Nếu bạn có nhiều mảng 2D đến
4
27 cùng nhau, bạn có thể xem xét hàm4
28, giúp đơn giản hóa cú pháp của nhiều4
29 lồng nhau. Lưu ý rằng điều này chỉ hoạt động với các mảng 2D [nghĩa là không cho phép nhân vector ma trận].2D arrays to4
27 together, you may consider the4
28 function, which simplifies the syntax of many nested4
29s. Note that this only works with 2D arrays [i.e. not for matrix-vector multiplication].>>> np.dot[np.dot[a, a.T], a].dot[a.T] array[[[1406, 382, 446], [ 382, 106, 126], [ 446, 126, 152]]] >>> np.linalg.multi_dot[[a, a.T, a, a.T]] array[[[1406, 382, 446], [ 382, 106, 126], [ 446, 126, 152]]]
Tùy chọn hiếm hơn cho các trường hợp cạnh
Nếu bạn có tenxơ [mảng có kích thước lớn hơn hoặc bằng một], bạn có thể sử dụng
4
30 với đối số tùy chọn4
31:>>> np.tensordot[a, b, axes=1] array[[16, 6, 8]]
Không sử dụng
4
32 Nếu bạn có một ma trận các số phức, vì ma trận sẽ được làm phẳng thành một mảng 1D, thì nó sẽ cố gắng tìm sản phẩm chấm liên hợp phức tạp giữa ma trận và vector được làm phẳng của bạn [sẽ thất bại do kích thước Không phù hợp4
33 so với4
34]. if you have a matrix of complex numbers, as the matrix will be flattened to a 1D array, then it will try to find the complex conjugate dot product between your flattened matrix and vector [which will fail due to a size mismatch4
33 vs4
34].