Hướng dẫn how do you do a matrix matrix multiplication in python? - làm thế nào để bạn thực hiện phép nhân ma trận trong python?

Trong Python, chúng ta có thể triển khai một ma trận dưới dạng danh sách lồng nhau (danh sách bên trong danh sách).

Chúng ta có thể coi từng phần tử như một hàng của ma trận.

Ví dụ

[114, 160, 60, 27]
[74, 97, 73, 14]
[119, 157, 112, 23]
0 sẽ đại diện cho một ma trận
[114, 160, 60, 27]
[74, 97, 73, 14]
[119, 157, 112, 23]
1.

Hàng đầu tiên có thể được chọn là

[114, 160, 60, 27]
[74, 97, 73, 14]
[119, 157, 112, 23]
2. Và, phần tử trong hàng đầu tiên, cột đầu tiên có thể được chọn là
[114, 160, 60, 27]
[74, 97, 73, 14]
[119, 157, 112, 23]
3.

Sự nhân của hai ma trận x và y chỉ được xác định nếu số lượng cột trong x bằng số lượng hàng y.

Nếu x là ma trận

[114, 160, 60, 27]
[74, 97, 73, 14]
[119, 157, 112, 23]
4 và y là ma trận
[114, 160, 60, 27]
[74, 97, 73, 14]
[119, 157, 112, 23]
5 thì XY được xác định và có kích thước
[114, 160, 60, 27]
[74, 97, 73, 14]
[119, 157, 112, 23]
6 (nhưng yx không được xác định). Dưới đây là một vài cách để thực hiện phép nhân ma trận trong Python.

Mã nguồn: phép nhân ma trận bằng cách sử dụng vòng lặp lồng nhau

# Program to multiply two matrices using nested loops

# 3x3 matrix
X = [[12,7,3],
    [4 ,5,6],
    [7 ,8,9]]
# 3x4 matrix
Y = [[5,8,1,2],
    [6,7,3,0],
    [4,5,9,1]]
# result is 3x4
result = [[0,0,0,0],
         [0,0,0,0],
         [0,0,0,0]]

# iterate through rows of X
for i in range(len(X)):
   # iterate through columns of Y
   for j in range(len(Y[0])):
       # iterate through rows of Y
       for k in range(len(Y)):
           result[i][j] += X[i][k] * Y[k][j]

for r in result:
   print(r)

Đầu ra

[114, 160, 60, 27]
[74, 97, 73, 14]
[119, 157, 112, 23]

Trong chương trình này, chúng tôi đã sử dụng các vòng lặp

[114, 160, 60, 27]
[74, 97, 73, 14]
[119, 157, 112, 23]
7 lồng nhau để lặp qua mỗi hàng và mỗi cột. Chúng tôi tích lũy tổng sản phẩm trong kết quả.

Kỹ thuật này đơn giản nhưng tốn kém về mặt tính toán khi chúng tôi tăng thứ tự của ma trận.

Đối với các hoạt động ma trận lớn hơn, chúng tôi khuyên bạn nên sử dụng các gói phần mềm được tối ưu hóa như Numpy, theo thứ tự (theo thứ tự 1000) lần so với mã trên.

Mã nguồn: phép nhân ma trận bằng cách sử dụng danh sách lồng nhau

# Program to multiply two matrices using list comprehension

# 3x3 matrix
X = [[12,7,3],
    [4 ,5,6],
    [7 ,8,9]]

# 3x4 matrix
Y = [[5,8,1,2],
    [6,7,3,0],
    [4,5,9,1]]

# result is 3x4
result = [[sum(a*b for a,b in zip(X_row,Y_col)) for Y_col in zip(*Y)] for X_row in X]

for r in result:
   print(r)

Đầu ra của chương trình này giống như trên. Để hiểu mã trên trước tiên, trước tiên chúng ta phải biết về chức năng tích hợp

[114, 160, 60, 27]
[74, 97, 73, 14]
[119, 157, 112, 23]
8 và giải nén danh sách đối số bằng cách sử dụng toán tử *.

Chúng tôi đã sử dụng sự hiểu biết danh sách lồng nhau để lặp qua từng phần tử trong ma trận. Mã trông phức tạp và không thể đọc được lúc đầu. Nhưng một khi bạn hiểu được sự hiểu biết danh sách, có lẽ bạn sẽ không quay lại các vòng lặp lồng nhau.

numpy.matmul (x1, x2, /, out = none, *, casting = 'giống nhau_kind', order = 'k', dtype = none, subok = true [matmul(x1, x2, /, out=None, *, casting='same_kind', order='K', dtype=None, subok=True[, signature, extobj, axes, axis])= 'matmul'>#

Sản phẩm ma trận của hai mảng.

Tham sốx1, x2array_likex1, x2array_like

Mảng đầu vào, vô hướng không được phép.

Outndarray, tùy chọnndarray, optional

Một vị trí mà kết quả được lưu trữ. Nếu được cung cấp, nó phải có một hình dạng phù hợp với chữ ký (n, k), (k, m)-> (n, m). Nếu không được cung cấp hoặc không có, một mảng mới được phân bổ được trả lại.

**kwargs

Đối với các đối số chỉ từ khóa khác, hãy xem các tài liệu UFUNC.ufunc docs.

Mới trong phiên bản 1.16: Bây giờ xử lý UFUNC KWARGSNow handles ufunc kwargs

Returnsyndarrayyndarray

Sản phẩm ma trận của các đầu vào. Đây chỉ là vô hướng khi cả x1, x2 là vectơ 1 chiều.

RAISEVALUEERROR

Nếu kích thước cuối cùng của X1 không có cùng kích thước với kích thước thứ hai đến cuối cùng của X2.

Nếu một giá trị vô hướng được truyền vào.

Xem thêm

[114, 160, 60, 27]
[74, 97, 73, 14]
[119, 157, 112, 23]
9

Sản phẩm DOT liên hợp phức tạp.

# Program to multiply two matrices using list comprehension

# 3x3 matrix
X = [[12,7,3],
    [4 ,5,6],
    [7 ,8,9]]

# 3x4 matrix
Y = [[5,8,1,2],
    [6,7,3,0],
    [4,5,9,1]]

# result is 3x4
result = [[sum(a*b for a,b in zip(X_row,Y_col)) for Y_col in zip(*Y)] for X_row in X]

for r in result:
   print(r)
0

Tổng sản phẩm trên các trục tùy ý.

# Program to multiply two matrices using list comprehension

# 3x3 matrix
X = [[12,7,3],
    [4 ,5,6],
    [7 ,8,9]]

# 3x4 matrix
Y = [[5,8,1,2],
    [6,7,3,0],
    [4,5,9,1]]

# result is 3x4
result = [[sum(a*b for a,b in zip(X_row,Y_col)) for Y_col in zip(*Y)] for X_row in X]

for r in result:
   print(r)
1

Công ước tổng kết Einstein.

# Program to multiply two matrices using list comprehension

# 3x3 matrix
X = [[12,7,3],
    [4 ,5,6],
    [7 ,8,9]]

# 3x4 matrix
Y = [[5,8,1,2],
    [6,7,3,0],
    [4,5,9,1]]

# result is 3x4
result = [[sum(a*b for a,b in zip(X_row,Y_col)) for Y_col in zip(*Y)] for X_row in X]

for r in result:
   print(r)
2

Sản phẩm ma trận thay thế với các quy tắc phát sóng khác nhau.

Ghi chú

Hành vi phụ thuộc vào các đối số theo cách sau.

  • Nếu cả hai đối số là 2 chiều, chúng được nhân như ma trận thông thường.

  • Nếu một trong hai đối số là N-D, N> 2, nó được coi là một chồng ma trận cư trú trong hai chỉ mục cuối cùng và phát sóng tương ứng.

  • Nếu đối số đầu tiên là 1-D, nó sẽ được quảng bá thành ma trận bằng cách dành một kích thước 1 đến kích thước của nó. Sau khi phép nhân ma trận, 1 được chuẩn bị được loại bỏ.

  • Nếu đối số thứ hai là 1-D, nó được quảng bá thành ma trận bằng cách nối thêm kích thước 1 vào kích thước của nó. Sau khi phép nhân ma trận, 1 được thêm vào được loại bỏ.

# Program to multiply two matrices using list comprehension

# 3x3 matrix
X = [[12,7,3],
    [4 ,5,6],
    [7 ,8,9]]

# 3x4 matrix
Y = [[5,8,1,2],
    [6,7,3,0],
    [4,5,9,1]]

# result is 3x4
result = [[sum(a*b for a,b in zip(X_row,Y_col)) for Y_col in zip(*Y)] for X_row in X]

for r in result:
   print(r)
3 khác với
# Program to multiply two matrices using list comprehension

# 3x3 matrix
X = [[12,7,3],
    [4 ,5,6],
    [7 ,8,9]]

# 3x4 matrix
Y = [[5,8,1,2],
    [6,7,3,0],
    [4,5,9,1]]

# result is 3x4
result = [[sum(a*b for a,b in zip(X_row,Y_col)) for Y_col in zip(*Y)] for X_row in X]

for r in result:
   print(r)
2 theo hai cách quan trọng:

  • Không được phép nhân lên theo vô hướng, sử dụng

    # Program to multiply two matrices using list comprehension
    
    # 3x3 matrix
    X = [[12,7,3],
        [4 ,5,6],
        [7 ,8,9]]
    
    # 3x4 matrix
    Y = [[5,8,1,2],
        [6,7,3,0],
        [4,5,9,1]]
    
    # result is 3x4
    result = [[sum(a*b for a,b in zip(X_row,Y_col)) for Y_col in zip(*Y)] for X_row in X]
    
    for r in result:
       print(r)
    
    5 thay thế.

  • Các ngăn xếp ma trận được phát cùng nhau như thể các ma trận là các yếu tố, tôn trọng chữ ký

    # Program to multiply two matrices using list comprehension
    
    # 3x3 matrix
    X = [[12,7,3],
        [4 ,5,6],
        [7 ,8,9]]
    
    # 3x4 matrix
    Y = [[5,8,1,2],
        [6,7,3,0],
        [4,5,9,1]]
    
    # result is 3x4
    result = [[sum(a*b for a,b in zip(X_row,Y_col)) for Y_col in zip(*Y)] for X_row in X]
    
    for r in result:
       print(r)
    
    6:

    >>> a = np.ones([9, 5, 7, 4])
    >>> c = np.ones([9, 5, 4, 3])
    >>> np.dot(a, c).shape
    (9, 5, 7, 9, 5, 3)
    >>> np.matmul(a, c).shape
    (9, 5, 7, 3)
    >>> # n is 7, k is 4, m is 3
    

Hàm Matmul thực hiện ngữ nghĩa của toán tử

# Program to multiply two matrices using list comprehension

# 3x3 matrix
X = [[12,7,3],
    [4 ,5,6],
    [7 ,8,9]]

# 3x4 matrix
Y = [[5,8,1,2],
    [6,7,3,0],
    [4,5,9,1]]

# result is 3x4
result = [[sum(a*b for a,b in zip(X_row,Y_col)) for Y_col in zip(*Y)] for X_row in X]

for r in result:
   print(r)
7 được giới thiệu trong Python 3.5 sau PEP 465.PEP 465.

Ví dụ

Đối với các mảng 2 chiều, đó là sản phẩm ma trận:

>>> a = np.array([[1, 0],
...               [0, 1]])
>>> b = np.array([[4, 1],
...               [2, 2]])
>>> np.matmul(a, b)
array([[4, 1],
       [2, 2]])

Đối với 2 chiều trộn với 1-D, kết quả là thông thường.

>>> a = np.array([[1, 0],
...               [0, 1]])
>>> b = np.array([1, 2])
>>> np.matmul(a, b)
array([1, 2])
>>> np.matmul(b, a)
array([1, 2])

Phát sóng là thông thường cho các ngăn xếp của mảng

>>> a = np.arange(2 * 2 * 4).reshape((2, 2, 4))
>>> b = np.arange(2 * 2 * 4).reshape((2, 4, 2))
>>> np.matmul(a,b).shape
(2, 2, 2)
>>> np.matmul(a, b)[0, 1, 1]
98
>>> sum(a[0, 1, :] * b[0 , :, 1])
98

Vector, Vector trả về sản phẩm bên trong vô hướng, nhưng không đối số nào được kết hợp phức tạp:

>>> np.matmul([2j, 3j], [2j, 3j])
(-13+0j)

Nhân vô hướng làm tăng lỗi.

>>> np.matmul([1,2], 3)
Traceback (most recent call last):
...
ValueError: matmul: Input operand 1 does not have enough dimensions ...

Toán tử

# Program to multiply two matrices using list comprehension

# 3x3 matrix
X = [[12,7,3],
    [4 ,5,6],
    [7 ,8,9]]

# 3x4 matrix
Y = [[5,8,1,2],
    [6,7,3,0],
    [4,5,9,1]]

# result is 3x4
result = [[sum(a*b for a,b in zip(X_row,Y_col)) for Y_col in zip(*Y)] for X_row in X]

for r in result:
   print(r)
7 có thể được sử dụng làm tốc ký cho
# Program to multiply two matrices using list comprehension

# 3x3 matrix
X = [[12,7,3],
    [4 ,5,6],
    [7 ,8,9]]

# 3x4 matrix
Y = [[5,8,1,2],
    [6,7,3,0],
    [4,5,9,1]]

# result is 3x4
result = [[sum(a*b for a,b in zip(X_row,Y_col)) for Y_col in zip(*Y)] for X_row in X]

for r in result:
   print(r)
9 trên ndarrays.

>>> x1 = np.array([2j, 3j])
>>> x2 = np.array([2j, 3j])
>>> x1 @ x2
(-13+0j)

Mới trong phiên bản 1.10.0.