Hướng dẫn python matrix multiplication different dimensions - phép nhân ma trận python các thứ nguyên khác nhau

Sự nhân của mảng thứ n [giả sử a] với 1D một [b] được thực hiện trên trục cuối cùng theo mặc định, điều đó có nghĩa là phép nhân A * B chỉ hợp lệ nếu

 axis = 1
 C = [A.swapaxes[axis, -1] * B].swapaxes[axis, -1]
4

Một thao tác trên A và B là cần thiết để nhân A với B trên trục khác so với -1:

Phương pháp 1: SWAPAXES

Trao đổi các trục của A sao cho trục nhân với B xuất hiện trên POSTION LAST

 axis = 1
 C = [A.swapaxes[axis, -1] * B].swapaxes[axis, -1]
5

thí dụ

A = np.arange[2 * 3 * 4].reshape[[2, 3, 4]]
B = np.array[[0., 1., 2.]]
print[A]
print[B]

Pormpts:

[A]
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
[B] 
[0. 1. 2.]

A * B trả về:

ValueError: operands could not be broadcast together with shapes [2,3,4] [3,]

bây giờ nhân A với B trên trục 1

 axis = 1
 C = [A.swapaxes[axis, -1] * B].swapaxes[axis, -1]

trả lại C:

    array[[[[ 0.,  0.,  0.,  0.],
            [ 4.,  5.,  6.,  7.],
            [16., 18., 20., 22.]],
    
           [[ 0.,  0.,  0.,  0.],
            [16., 17., 18., 19.],
            [40., 42., 44., 46.]]]]

Lưu ý rằng các loại thô đầu tiên của A đã được nhân với 0 RAW cuối cùng đã được nhân với 2

Phương pháp 2: Đổi lại B

Tạo B có cùng số lượng kích thước so với a, đặt các mục B trên kích thước được nhân với a

A * B.reshape[[1, len[B], 1]]

hoặc tương đương bằng cách sử dụng cú pháp 'numpy.newaxis' thuận tiện:

A * B[np.newaxis, :, np.newaxis]

import numpy as np

# two dimensional arrays

m1 = np.array[[[1,4,7],[2,5,8]]]

m2 = np.array[[[1,4],[2,5],[3,6]]]

m3 = np.dot[m1,m2]

print[m3]

# three dimensional arrays

m1 = [[1, 6, 5],[3 ,4, 8],[2, 12, 3]]

m2 = [[3, 4, 6],[5, 6, 7],[6,56, 7]]

m3 = np.dot[m1,m2]

print[m3]

Trong hướng dẫn này, chúng tôi sẽ xem xét các cách khác nhau để thực hiện phép nhân ma trận bằng cách sử dụng các mảng & nbsp; numpy. Chúng ta sẽ học cách nhân ma trận với các kích thước khác nhau với nhau.

Ngoài ra, chúng tôi sẽ học cách tăng tốc quá trình nhân bằng GPU và các chủ đề nóng khác, vì vậy hãy bắt đầu!

Trước khi chúng ta tiến lên phía trước, tốt hơn là xem xét một số thuật ngữ cơ bản của đại số ma trận.

  • Thuật ngữ cơ bản
  • Phép nhân ma trận với một vectơ
  • Phép nhân với ma trận khác
  • Phép nhân giữa 3 ma trận
  • Phép nhân ma trận 3D numpy
  • Giải pháp thay thế cho NP.Matmul []
    • Phương thức ‘np.dot []
    • Nhà điều hành ‘@@
  • Phép nhân với vô hướng [giá trị đơn]
  • Phép nhân ma trận yếu tố khôn ngoan
  • Ma trận được nâng lên thành một nguồn điện [số mũ ma trận]
    • Phần tử khôn ngoan
    • Phép nhân từ một chỉ mục cụ thể
  • Phép nhân ma trận bằng GPU
    • Sử dụng CPU
    • Sử dụng GPU
  • Sự kết luận

Thuật ngữ cơ bản

Phép nhân ma trận với một vectơAlgebraically, a vector is a collection of coordinates of a point in space.
Thus, a vector with two values represents a point in a 2-dimensional space. In Computer Science, a vector is an arrangement of numbers along a single dimension. It is also commonly known as an array or a list or a tuple.
Eg. [1,2,3,4]

Phép nhân với ma trận khác A matrix [plural matrices] is a 2-dimensional arrangement of numbers or a collection of vectors.
Ex:

[[1,2,3],[4,5,6],[7,8,9]]

Phép nhân giữa 3 ma trậnA dot product is a mathematical operation between 2 equal-length vectors.
It is equal to the sum of the products of the corresponding elements of the vectors.

Phép nhân ma trận 3D numpy

Phép nhân ma trận với một vectơ

Phép nhân với ma trận khác

Phép nhân giữa 3 ma trận

Phép nhân ma trận 3D numpyarray[] method is used to represent vectors, matrices, and higher-dimensional tensors. Lets define a 5-dimensional vector and a 3×3 matrix using NumPy.

import numpy as npa = np.array[[1, 3, 5, 7, 9]]b = np.array[[[1, 2, 3],             [4, 5, 6],             [7, 8, 9]]]print["Vector a:\n", a]print[]print["Matrix b:\n", b]

Output:


Giải pháp thay thế cho NP.Matmul []

Đối với phép nhân vectơ ma trận, bạn nên ghi nhớ các điểm sau:

  1. Kết quả của phép nhân vector ma trận là một vectơ.
  2. Mỗi phần tử của vectơ này có được bằng cách thực hiện một sản phẩm chấm giữa mỗi hàng của ma trận và vectơ được nhân lên.
  3. Số lượng cột trong ma trận phải bằng số lượng phần tử trong vectơ.


Sử dụng tốt numpys & nbsp; matmul [] & nbsp; Phương thức cho hầu hết các hoạt động nhân ma trận của chúng tôi. Xác định ma trận 3 × 3 và nhân nó với một vectơ có độ dài 3.matmul[] method for most of our matrix multiplication operations.
Lets define a 3×3 matrix and multiply it with a vector of length 3.

[A]
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
[B] 
[0. 1. 2.]
0

Đầu ra: Lưu ý cách kết quả là một vectơ có độ dài bằng các hàng của ma trận số nhân.


Notice how the result is a vector of length equal to the rows of the multiplier matrix.

Phép nhân với ma trận khác

Bây giờ, & nbsp; Chúng tôi hiểu sự nhân của một ma trận với một vectơ; Sẽ rất dễ dàng để tìm ra sự nhân của hai ma trận. Nhưng trước đó, hãy xem xét các quy tắc quan trọng nhất của phép nhân ma trận:
But, before that, lets review the most important rules of matrix multiplication:

  1. Số lượng cột trong ma trận thứ nhất phải bằng số lượng hàng trong ma trận thứ hai.
  2. Nếu chúng ta đang nhân một ma trận kích thước m x ​​n với một ma trận khác có kích thước n x p, thì sản phẩm kết quả sẽ là một ma trận kích thước m x ​​p.

Chúng ta hãy xem xét phép nhân của ma trận m x n a với ma trận n x p Trong một vectơ cột trong B.


The product of the two matrices C = AB will have m row and p columns.
Each element in the product matrix C results from a dot product between a row vector in A and a column vector in B.


Bây giờ chúng ta hãy thực hiện phép nhân ma trận của 2 ma trận trong Python, sử dụng numpy .well ngẫu nhiên tạo hai ma trận có kích thước 3 x 2 và 2 x 4. Chúng ta sẽ sử dụng & nbsp; np.random.randint [] & nbsp;
Well randomly generate two matrices of dimensions 3 x 2 and 2 x 4.
We will use np.random.randint[] method to generate the numbers.

[A]
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
[B] 
[0. 1. 2.]
1

Đầu ra: Lưu ý: Chúng tôi đang đặt một hạt giống ngẫu nhiên bằng np.random.seed [] để tạo trình tạo số ngẫu nhiên xác định. Điều này sẽ tạo cùng một số ngẫu nhiên mỗi khi bạn chạy đoạn mã này. Bước này là điều cần thiết nếu bạn muốn tái tạo kết quả của mình tại một điểm sau.


Note: we are setting a random seed using np.random.seed[] to make the random number generator deterministic.
This will generate the same random numbers each time you run this code snippet. This step is essential if you want to reproduce your result at a later point.

Bạn có thể đặt bất kỳ số nguyên nào khác làm hạt giống, nhưng tôi khuyên bạn nên đặt nó thành 42 cho hướng dẫn này để đầu ra của bạn sẽ khớp với các ảnh hiển thị trong ảnh chụp màn hình đầu ra.

Bây giờ chúng ta hãy nhân hai ma trận bằng phương thức & nbsp; np.matmul [] & nbsp; Ma trận kết quả phải có hình 3 x 4.np.matmul[] method. The resulting matrix should have the shape 3 x 4.

[A]
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
[B] 
[0. 1. 2.]
2

Output:

Phép nhân giữa 3 ma trận

Sự nhân của ba ma trận sẽ bao gồm hai hoạt động nhân 2 ma trận và mỗi trong hai hoạt động sẽ tuân theo các quy tắc giống như đã thảo luận trong phần trước.

Hãy để chúng tôi nói rằng chúng tôi đang nhân ba ma trận A, B và C và sản phẩm là D = abc.here, số lượng cột trong A phải bằng số lượng hàng trong B và số lượng hàng trong C nên bằng số lượng cột trong B.
Here, the number of columns in A should be equal to the number of rows in B, and the number of rows in C should be equal to the number of columns in B.

Ma trận kết quả sẽ có các hàng bằng số lượng hàng trong A và các cột bằng số lượng cột trong C.

Một thuộc tính quan trọng của hoạt động nhân ma trận là & nbsp; đó là sự kết hợp. Với phép nhân đa ma trận, thứ tự của các hoạt động nhân riêng lẻ không quan trọng và do đó không mang lại kết quả khác nhau.it is Associative.
With multi-matrix multiplication, the order of individual multiplication operations does not matter and hence does not yield different results.

Chẳng hạn, trong ví dụ của chúng tôi về phép nhân 3 ma trận D = ABC, sẽ không quan trọng nếu chúng ta thực hiện AB đầu tiên hoặc BC trước.


Cả hai đơn đặt hàng sẽ mang lại kết quả tương tự. Hãy để chúng tôi làm một ví dụ trong Python.

[A]
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
[B] 
[0. 1. 2.]
3

Đầu ra: Dựa trên các quy tắc chúng tôi đã thảo luận ở trên, sự nhân của ba ma trận này sẽ mang lại một ma trận hình dạng kết quả [2, 3] .note & nbsp; rằng phương pháp & nbsp; , vì vậy chúng tôi sẽ gọi phương thức hai lần theo thứ tự mà chúng tôi muốn nhân và vượt qua kết quả của cuộc gọi đầu tiên dưới dạng tham số sang lần thứ hai. @ nhà điều hành]


Based on the rules we discussed above, the multiplication of these three matrices should yield a resulting matrix of shape [2, 3].
Note that the method np.matmul[] accepts only two matrices as input for multiplication, so we will call the method twice in the order that we wish to multiply, and pass the result of the first call as a parameter to the second.
[Well find a better way to deal with this problem in a later section when we introduce @ operator]

Hãy thực hiện phép nhân trong cả hai đơn đặt hàng và xác nhận tính chất của sự kết hợp.

[A]
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
[B] 
[0. 1. 2.]
4

Đầu ra: Như chúng ta có thể thấy, kết quả của phép nhân của ba ma trận vẫn giữ nguyên cho dù chúng ta nhân A và B trước, hoặc B và C Đầu tiên. là [2, 3], trên các dòng dự kiến.


As we can see, the result of the multiplication of the three matrices remains the same whether we multiply A and B first, or B and C first.
Thus, the property of associativity stands validated.
Also, the shape of the resulting array is [2, 3], which is on the expected lines.

Một ma trận 3D không là gì ngoài một bộ sưu tập [hoặc một ngăn xếp] của nhiều ma trận 2D, giống như cách một ma trận 2D là một bộ sưu tập/ngăn xếp của nhiều vectơ 1D.

Vì vậy, phép nhân ma trận của ma trận 3D liên quan đến nhiều phép nhân của ma trận 2D, cuối cùng sôi lên với một sản phẩm chấm giữa các vectơ hàng/cột của chúng.

Chúng ta hãy xem xét một ma trận ví dụ A có hình dạng [3,3,2] nhân với một ma trận 3D B khác của hình dạng [3,2,4].

[A]
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
[B] 
[0. 1. 2.]
5

Đầu ra: Ma trận đầu tiên là một chồng của ba ma trận 2D mỗi hình dạng [3,2] và ma trận thứ hai là một chồng của 3 ma trận 2D, mỗi hình dạng [2,4].


The first matrix is a stack of three 2D matrices each of shape [3,2], and the second matrix is a stack of 3 2D matrices, each of shape [2,4].

Sự nhân ma trận giữa hai điều này sẽ liên quan đến ba phép nhân giữa các ma trận 2D tương ứng của A và B có hình dạng [3,2] và [2,4] tương ứng.

Cụ thể, phép nhân thứ nhất sẽ nằm giữa A [0] và B [0], phép nhân thứ hai sẽ nằm giữa A [1] và B [1], và cuối cùng, phép nhân thứ ba sẽ nằm giữa A [2] và B [ 2].

Kết quả của mỗi phép nhân riêng lẻ của ma trận 2D sẽ có hình dạng [3,4]. Do đó, sản phẩm cuối cùng của hai ma trận 3D sẽ là một ma trận hình dạng [3,3,4].

Hãy nhận ra điều này bằng cách sử dụng mã.

[A]
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
[B] 
[0. 1. 2.]
6

Output:

Giải pháp thay thế cho NP.Matmul []

Ngoài np.matmul [], có hai cách khác nhau để thực hiện phép nhân ma trận - & nbsp; np.dot [] & nbsp; phương thức và toán tử & nbsp;np.dot[] method and the @ operator, each offering some differences/flexibility in matrix multiplication operations.

Phương thức ‘np.dot []

Bạn có thể sử dụng phương pháp này để tìm sản phẩm chấm của các vectơ, nhưng nếu chúng ta vượt qua hai ma trận 2 chiều, thì nó sẽ hoạt động tương tự với phương thức np.matmul [] và sẽ trả về kết quả nhân ma trận của hai ma trận.

Chúng ta hãy xem xét một ví dụ:

[A]
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
[B] 
[0. 1. 2.]
7

Đầu ra: Ở đây, chúng tôi đã xác định ma trận 3 × 2 và ma trận 2 × 3 và sản phẩm DOT của chúng mang lại kết quả 2 × 2 là phép nhân ma trận của hai ma trận, giống như những gì NP.Matmul [] sẽ trả về .


Here, we defined a 3×2 matrix, and a 2×3 matrix and their dot product yields a 2×2 result which is the matrix multiplication of the two matrices,
the same as what np.matmul[] would have returned.

Sự khác biệt giữa & nbsp; giữa np.dot [] và np.matmul [] & nbsp; nằm trong hoạt động của họ trên ma trận 3D. Trong phần cuối], mặt khác, NP.DOT [] tính toán các sản phẩm DOT của các cặp vectơ và vectơ cột khác nhau từ ma trận thứ nhất và thứ hai tương ứng. difference between np.dot[] and np.matmul[] is in their operation on 3D matrices.
While np.matmul[] operates on two 3D matrices by computing matrix multiplication of the corresponding pairs of 2D matrices [as discussed in the last section], np.dot[] on the other hand computes dot products of various pairs of row vectors and column vectors from the first and second matrix respectively.

np.dot [] trên hai ma trận 3D A và B trả về một sản phẩm tổng trong trục cuối cùng của & nbsp; a & nbsp; và trục B. này không trực quan và không dễ hiểu.a sum-product over the last axis of A and the second-to-last axis of B.
This is non-intuitive and not easily comprehensible.

Vì vậy, nếu A có hình dạng [A, B, C] và B có hình dạng [D, C, E], thì kết quả của NP.DOT [A, B] sẽ có hình dạng [A, D, B, e] có phần tử riêng lẻ ở một vị trí [i, j, k, m] được đưa ra bởi:

[A]
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
[B] 
[0. 1. 2.]
8

Hãy kiểm tra một ví dụ:

[A]
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
[B] 
[0. 1. 2.]
9

Đầu ra: Nếu bây giờ chúng ta chuyển các ma trận này cho phương thức np.dot [], nó sẽ trả về một ma trận hình dạng [2,3,3,4] có các phần tử riêng lẻ được tính toán bằng cách sử dụng công thức được đưa ra ở trên.


If we now pass these matrices to the np.dot[] method, it will return a matrix of shape [2,3,3,4] whose individual elements are computed using the formula given above.

ValueError: operands could not be broadcast together with shapes [2,3,4] [3,]
0

Đầu ra: Một sự khác biệt quan trọng khác giữa np.matmul [] và np.dot [] là np.matmul [] không cho phép nhân với vô hướng [chúng tôi sẽ thảo luận trong phần tiếp theo], trong khi np.dot [] cho phép nó.


Another important difference between np.matmul[] and np.dot[] is that np.matmul[] doesnt allow multiplication with a scalar [we will discuss in the next section], while np.dot[] allows it.

Nhà điều hành ‘@@

Toán tử @ được giới thiệu trong Python 3.5, nó thực hiện hoạt động tương tự như np.matmul [].

Cho phép chạy qua một ví dụ trước đó về np.matmul [] sử dụng toán tử @ và sẽ thấy kết quả tương tự như đã trả về trước đó:

ValueError: operands could not be broadcast together with shapes [2,3,4] [3,]
1

Đầu ra: Toán tử @ trở nên tiện dụng khi chúng ta đang thực hiện phép nhân ma trận trên hai ma trận.


The @ operator becomes handy when we are performing matrix multiplication of over two matrices.

Trước đó, chúng tôi phải gọi np.matmul [] nhiều lần và chuyển kết quả của họ dưới dạng tham số cho cuộc gọi tiếp theo. Bây giờ, chúng tôi có thể thực hiện cùng một thao tác theo cách đơn giản hơn [và trực quan hơn]:
Now, we can perform the same operation in a simpler [and a more intuitive] way:

ValueError: operands could not be broadcast together with shapes [2,3,4] [3,]
2

Output:

Phép nhân với vô hướng [giá trị đơn]

Cho đến nay, Weve đã thực hiện phép nhân ma trận với một vectơ hoặc ma trận khác. Nhưng điều gì xảy ra khi chúng ta thực hiện phép nhân ma trận với vô hướng hoặc một giá trị số duy nhất?

Kết quả của một hoạt động như vậy là có bằng cách nhân mỗi phần tử trong ma trận với giá trị vô hướng. Do đó, ma trận đầu ra có cùng kích thước với ma trận đầu vào.

Lưu ý rằng np.matmul [] không cho phép nhân ma trận với vô hướng. Bạn có thể đạt được điều này bằng cách sử dụng phương thức np.dot [] & nbsp; hoặc sử dụng toán tử & nbsp;*.np.dot[] method or using the * operator.

Hãy xem điều này trong một ví dụ mã.

ValueError: operands could not be broadcast together with shapes [2,3,4] [3,]
3

Output:

Phép nhân ma trận yếu tố khôn ngoan

Đôi khi chúng ta muốn nhân các yếu tố tương ứng của hai ma trận có cùng hình dạng.


Hoạt động này cũng được gọi là sản phẩm & nbsp; Hadamard. & NBSP; Nó chấp nhận hai ma trận có cùng kích thước và tạo ra một ma trận thứ ba có cùng kích thước.Hadamard Product. It accepts two matrices of the same dimensions and produces a third matrix of the same dimension.

Bạn có thể đạt được điều này bằng cách gọi numpys nhân [] & nbsp; hàm hoặc sử dụng toán tử & nbsp;*.NumPys multiply[] function or using the * operator.

ValueError: operands could not be broadcast together with shapes [2,3,4] [3,]
4

Đầu ra: Quy tắc duy nhất bạn cần ghi nhớ cho phép nhân yếu tố là & nbsp; hai ma trận phải có cùng hình dạng. Tuy nhiên, nếu một chiều của ma trận bị thiếu, Numpy sẽ & NBSP; Ma trận khác.


The only rule you need to keep in mind for element-wise multiplication is that the two matrices should have the same shape.
However, if one dimension of a matrix is missing, NumPy would broadcast it to match the shape of the other matrix.

Trên thực tế, phép nhân ma trận với vô hướng cũng liên quan đến việc phát sóng giá trị vô hướng thành một ma trận của hình dạng bằng với toán hạng ma trận trong phép nhân.

Điều đó có nghĩa là khi chúng ta nhân một ma trận hình dạng [3,3] với giá trị vô hướng 10, Numpy sẽ tạo ra một ma trận hình dạng khác [3,3] với các giá trị không đổi mười ở tất cả các vị trí trong ma trận và thực hiện phép nhân phần tử giữa Hai ma trận.

Hãy hiểu điều này thông qua một ví dụ:

ValueError: operands could not be broadcast together with shapes [2,3,4] [3,]
5

Đầu ra: Lưu ý cách ma trận thứ hai, có hình dạng [1,4] được chuyển thành ma trận [3,4] thông qua phát sóng và sự nhân lên của phần tử giữa hai ma trận đã diễn ra.


Notice how the second matrix, which had shape [1,4] was transformed into a [3,4] matrix through broadcasting, and the element-wise multiplication between the two matrices took place.

Ma trận được nâng lên thành một nguồn điện [số mũ ma trận]

Giống như cách chúng ta có thể nâng giá trị vô hướng lên số mũ, chúng ta có thể thực hiện cùng một hoạt động với ma trận. Chỉ cần nâng giá trị vô hướng [cơ sở] lên số mũ N bằng nhiều lần nhân lên các cơ sở N, cùng một mẫu được quan sát thấy trong Tăng một ma trận lên sức mạnh, liên quan đến phép nhân ma trận lặp đi lặp lại.
Just as raising a scalar value [base] to an exponent n is equal to repeatedly multiplying the n bases, the same pattern is observed in raising a matrix to power, which involves repeated matrix multiplications.

Chẳng hạn, nếu chúng ta nâng ma trận A lên công suất N, nó bằng với phép nhân ma trận của ma trận N, tất cả đều là ma trận A.


Lưu ý & nbsp; rằng để hoạt động này là có thể, ma trận cơ sở & nbsp; phải là hình vuông. Đây là để đảm bảo số lượng cột trong ma trận trước = số lượng hàng trong ma trận tiếp theo.base matrix has to be square.
This is to ensure the number of columns in preceding matrix = number of rows in the next matrix.

Hoạt động này được cung cấp trong Python bởi Numpys linalg.matrix_power [] & nbsp; phương thức, chấp nhận ma trận cơ sở và công suất số nguyên làm tham số của nó.linalg.matrix_power[] method, which accepts the base matrix and an integer power as its parameters.

Chúng ta hãy xem một ví dụ trong Python:

ValueError: operands could not be broadcast together with shapes [2,3,4] [3,]
6

Đầu ra: Chúng tôi có thể xác thực kết quả này bằng cách thực hiện phép nhân ma trận thông thường với ba toán hạng [tất cả đều là A], sử dụng toán tử @: Toán tử:


We can validate this result by doing normal matrix multiplication with three operands [all of them A], using the @ operator:

ValueError: operands could not be broadcast together with shapes [2,3,4] [3,]
7

Đầu ra: Như bạn có thể thấy, kết quả từ cả hai hoạt động phù hợp.


As you can see, the results from both operations are matching.

Một câu hỏi quan trọng phát sinh từ hoạt động này là -& nbsp; điều gì xảy ra khi sức mạnh là 0? Để trả lời câu hỏi này, chúng ta hãy xem xét điều gì xảy ra khi chúng ta nâng cơ sở vô hướng lên sức mạnh 0. Chúng ta nhận được giá trị 1, phải không? Bây giờ, tương đương với 1 trong đại số ma trận là gì? Bạn đoán nó đúng!What happens when the power is 0?
To answer this question, let us review what happens when we raise a scalar base to power 0.
We get the value 1, right? Now, what is the equivalent of 1 in Matrix Algebra? You guessed it right!

Nó là ma trận danh tính.

Vì vậy, nâng ma trận N X N lên nguồn 0 dẫn đến một ma trận nhận dạng i của hình dạng n x n.

Hãy nhanh chóng kiểm tra điều này trong Python, sử dụng ma trận trước đây của chúng tôi A.

ValueError: operands could not be broadcast together with shapes [2,3,4] [3,]
8

Output:

Phần tử khôn ngoan

Giống như cách chúng ta có thể thực hiện phép nhân phần tử của ma trận, chúng ta cũng có thể thực hiện số lượng số liệu theo phần tử, tức là, nâng từng phần tử riêng lẻ của ma trận lên một số sức mạnh.

Điều này có thể đạt được trong Python bằng cách sử dụng toán tử số mũ tiêu chuẩn ** - một ví dụ về & NBSP; quá tải toán tử.** - an example of operator overloading.

Một lần nữa, chúng ta có thể cung cấp một công suất không đổi duy nhất cho tất cả các phần tử trong ma trận hoặc ma trận năng lượng cho mỗi phần tử trong ma trận cơ sở.

Hãy xem xét các ví dụ về cả hai trong Python:

ValueError: operands could not be broadcast together with shapes [2,3,4] [3,]
9

Output:

Phép nhân từ một chỉ mục cụ thể

Giả sử chúng ta có ma trận 5 x 6 và ma trận 3 x 3 khác B. Rõ ràng, chúng ta không thể nhân hai người này với nhau, vì sự không nhất quán về chiều.

Nhưng điều gì sẽ xảy ra nếu chúng ta muốn nhân Submatrix 3 × 3 trong ma trận A với ma trận B trong khi vẫn giữ các phần tử khác trong một không thay đổi? Để hiểu rõ hơn, hãy tham khảo hình ảnh sau:
For better understanding, refer to the following image:


Bạn có thể đạt được hoạt động này trong Python bằng cách sử dụng cắt ma trận để trích xuất Subatrix từ A, thực hiện nhân với B, sau đó viết lại kết quả tại chỉ số có liên quan trong A.matrix slicing to extract the submatrix from A, performing multiplication with B, and then writing back the result at relevant index in A.

Hãy xem điều này trong hành động.

 axis = 1
 C = [A.swapaxes[axis, -1] * B].swapaxes[axis, -1]
0

Đầu ra: Như bạn có thể thấy, chỉ các phần tử tại các chỉ số hàng 1 đến 3 và các chỉ số cột 2 đến 4 đã được nhân với B và điều tương tự đã được viết lại trong A, trong khi các phần tử còn lại của A vẫn không thay đổi.


As you can see, only the elements at row indices 1 to 3 and column indices 2 to 4 have been multiplied with B and the same have been written back in A, while the remaining elements of A have remained unchanged.

Ngoài ra, nó không cần thiết để ghi đè lên ma trận gốc. Chúng ta cũng có thể viết kết quả trong một ma trận mới bằng cách sao chép ma trận gốc vào một ma trận mới và sau đó viết sản phẩm ở vị trí của Subatrix.

Phép nhân ma trận bằng GPU

Chúng tôi biết rằng Numpy tăng tốc các hoạt động ma trận bằng cách song song hóa rất nhiều tính toán và sử dụng các khả năng tính toán song song CPU của chúng tôi.

Tuy nhiên, các ứng dụng hiện đại cần nhiều hơn thế. CPU cung cấp các khả năng tính toán hạn chế và nó không đủ cho số lượng lớn các tính toán mà chúng ta cần, thường là trong các ứng dụng như học sâu.

Đó là nơi GPU đi vào hình ảnh. Họ cung cấp các khả năng tính toán lớn và cơ sở hạ tầng tính toán song song tuyệt vời, giúp chúng tôi tiết kiệm một lượng thời gian đáng kể bằng cách thực hiện hàng trăm ngàn hoạt động trong các phân số trong vài giây.

Trong phần này, chúng tôi sẽ xem xét cách chúng tôi có thể thực hiện phép nhân ma trận trên GPU thay vì CPU và tiết kiệm rất nhiều thời gian để làm như vậy.

Numpy không cung cấp chức năng để thực hiện phép nhân ma trận trên GPU. Vì vậy, chúng tôi phải cài đặt một số thư viện bổ sung giúp chúng tôi đạt được mục tiêu của mình.

Trước tiên chúng tôi sẽ cài đặt các thư viện Scikit-Cuda và Pycuda bằng cách sử dụng Cài đặt PIP. Các thư viện này giúp chúng tôi thực hiện các tính toán trên GPU dựa trên CUDA. Để cài đặt các thư viện này từ thiết bị đầu cuối của bạn, nếu bạn đã cài đặt GPU trên máy.scikit-cuda and PyCUDA libraries using pip install. These libraries help us perform computations on CUDA based GPUs. To install these libraries from your terminal, if you have a GPU installed on your machine.

 axis = 1
 C = [A.swapaxes[axis, -1] * B].swapaxes[axis, -1]
1

Nếu bạn không có GPU trên máy của mình, bạn có thể thử & NBSP; Google Colab & NBSP; Notebooks và Bật quyền truy cập GPU; nó miễn phí để sử dụng. Bây giờ chúng tôi sẽ viết mã để tạo hai ma trận 1000 × 1000 và thực hiện phép nhân ma trận giữa chúng bằng hai phương pháp:

  1. Sử dụng phương thức numpys matmul [] trên CPUmatmul[] method on a CPU
  2. Sử dụng phương thức Scikit-Cudas linalg.mdot [] trên GPUlinalg.mdot[] method on a GPU

Trong phương pháp thứ hai, chúng ta sẽ tạo ra các ma trận trên CPU; Sau đó, chúng tôi sẽ lưu trữ chúng trên GPU [sử dụng phương thức pycudas gpuarray.to_gpu []] trước khi thực hiện phép nhân giữa chúng. Chúng tôi sẽ sử dụng mô -đun thời gian để tính thời gian tính toán trong cả hai trường hợp.gpuarray.to_gpu[] method] before performing the multiplication between them. We will use the time module to compute the time of computation in both cases.

Sử dụng CPU

 axis = 1
 C = [A.swapaxes[axis, -1] * B].swapaxes[axis, -1]
2

Output:

Trên một số hệ thống phần cứng cũ, bạn có thể gặp lỗi bộ nhớ, nhưng nếu bạn may mắn, nó sẽ hoạt động trong một thời gian dài [phụ thuộc vào hệ thống của bạn].

Bây giờ, chúng ta hãy thực hiện phép nhân tương tự trên GPU và xem thời gian tính toán khác nhau như thế nào giữa hai.

Sử dụng GPU

 axis = 1
 C = [A.swapaxes[axis, -1] * B].swapaxes[axis, -1]
3

Đầu ra: Như chúng ta có thể thấy, việc thực hiện hoạt động tương tự trên GPU cho chúng ta tăng tốc 70 lần như trên CPU. Đây vẫn là một tính toán nhỏ. Đối với các tính toán quy mô lớn, GPU cung cấp cho chúng tôi tốc độ tăng tốc độ lớn.


As we can see, performing the same operation on a GPU gives us a speed-up of 70 times as on CPU.
This was still a small computation. For large scale computations, GPUs give us speed-ups of a few orders of magnitude.

Sự kết luận

Trong hướng dẫn này, chúng tôi đã xem xét cách nhân của hai ma trận diễn ra, các quy tắc điều chỉnh chúng và cách thực hiện chúng trong Python. Hai ma trận, nhân chỉ ở một chỉ số cụ thể hoặc sức mạnh của ma trận.
We also looked at different variants of the standard matrix multiplication [and their implementation in NumPy] like multiplication of over two matrices, multiplication only at a particular index, or power of a matrix.

Chúng tôi cũng đã xem xét các tính toán theo yếu tố trong các ma trận như phép nhân ma trận yếu tố hoặc quá trình đặc trưng của phần tử.

Cuối cùng, chúng tôi đã xem xét làm thế nào chúng tôi có thể tăng tốc quá trình nhân ma trận bằng cách thực hiện chúng trên GPU.

MOKHTAR là người sáng lập của likeGeeks.com. Anh ta làm việc như một Quản trị viên hệ thống Linux & NBSP; kể từ năm 2010. Anh ta chịu trách nhiệm duy trì, bảo vệ và xử lý sự cố các máy chủ Linux cho nhiều khách hàng trên thế giới. Anh ấy thích viết kịch bản Shell và Python để tự động hóa tác phẩm của mình.

Làm thế nào để bạn nhân ma trận với các kích thước khác nhau trong Python?

Ví dụ: nếu ma trận 1 có kích thước a * n và ma trận 2 có kích thước n * b, thì ma trận kết quả có kích thước của a * b.Để nhân hai ma trận, sử dụng hàm dot [] của numpy.Chỉ mất 2 đối số và trả về sản phẩm của hai ma trận.use the dot[] function of NumPy. It takes only 2 arguments and returns the product of two matrices.

Bạn có thể nhân ma trận với các kích thước khác nhau không?

Bạn chỉ có thể nhân hai ma trận nếu kích thước của chúng tương thích, điều đó có nghĩa là số lượng cột trong ma trận thứ nhất giống như số lượng hàng trong ma trận thứ hai. , which means the number of columns in the first matrix is the same as the number of rows in the second matrix.

Các mảng numpy có thể có nhiều hơn 2 chiều không?

Mảng numpy có thể có 0, 1, 2 hoặc nhiều kích thước.C. Hình dạng trả về một bộ ba kích thước;Nó có thể có chiều dài 0, [], 1 giá trị, [81,] hoặc 2 [81,1].. C. shape returns a tuple of the dimensions; it may be of 0 length, [] , 1 value, [81,] , or 2 [81,1] .

Bài Viết Liên Quan

Chủ Đề