NumPy - 陣列乘法



NumPy 陣列乘法

NumPy 陣列乘法是指逐元素相乘兩個陣列的過程。在此上下文中,逐元素乘法意味著一個數組中的每個元素都乘以另一個數組中對應的元素。

結果是一個新陣列,其中每個元素表示輸入陣列中對應元素的乘積。

NumPy 中的逐元素乘法

逐元素乘法,也稱為哈達瑪積,是 NumPy 中的一種運算,其中兩個形狀相同的陣列相乘,並且運算應用於每對對應的元素。

為了執行逐元素乘法,兩個陣列必須具有相同的形狀。如果陣列的形狀不同,則會應用廣播規則以使它們相容。

示例

在下面的示例中,我們將陣列a的每個元素乘以陣列b中對應的元素 -

import numpy as np

# Creating two arrays
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

# Performing element-wise multiplication
result = a * b
print(result)

以下是獲得的輸出 -

[ 4 10 18]

在 NumPy 中乘以標量

標量乘法是指將陣列的每個元素乘以單個標量值。陣列中的每個元素都乘以標量值,從而產生一個新陣列,其中所有元素都相應地縮放。

結果陣列的形狀與原始陣列相同,但每個元素都按標量縮放。

示例

在此示例中,我們將標量“3”乘以陣列“a”的每個元素 -

import numpy as np

# Creating an array
a = np.array([1, 2, 3])

# Multiplying by a scalar
result = a * 3
print(result)

這將產生以下結果 -

[3 6 9]

乘以不同形狀的 NumPy 陣列

當乘以不同形狀的陣列時,NumPy 使用廣播使形狀與逐元素運算相容。廣播從最右側對齊維度,根據特定規則調整形狀,並順利執行運算。

示例

在下面的示例中,陣列“b”被廣播以匹配陣列“a”的形狀,然後執行逐元素乘法 -

import numpy as np

# Creating arrays with different shapes
a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.array([10, 20, 30])

# Multiplying arrays with broadcasting
result = a * b
print(result)

以下是上述程式碼的輸出 -

[[10 40 90]
 [40 100 180]]

NumPy 中的矩陣乘法

矩陣乘法是線性代數中的一種運算,其中兩個矩陣根據特定規則相乘。在 NumPy 中,此運算使用np.dot()函式、@運算子或np.matmul()函式執行。

為了使矩陣乘法有效,第一個矩陣的列數必須等於第二個矩陣的行數。如果矩陣A的形狀為(m, n),而矩陣B的形狀為(n, p),則結果矩陣的形狀將為(m, p)

示例:使用 numpy.dot() 函式

NumPy 中的 np.dot() 函式用於計算兩個陣列的點積。它處理 2D 陣列的矩陣乘法和 1D 陣列的點積 -

import numpy as np

# Define two matrices
matrix1 = np.array([[1, 2],
                    [3, 4]])

matrix2 = np.array([[5, 6],
                    [7, 8]])

# Perform matrix multiplication using np.dot
result = np.dot(matrix1, matrix2)
print(result)

獲得的輸出如下所示 -

[[19 22]
 [43 50]]

示例:使用“@”運算子

NumPy 中的@運算子為 np.dot() 函式提供了一種簡寫。它對 2D 陣列執行矩陣乘法,並用於計算 1D 陣列的點積 -

import numpy as np

# Define the same matrices
matrix1 = np.array([[1, 2],
                    [3, 4]])

matrix2 = np.array([[5, 6],
                    [7, 8]])

# Perform matrix multiplication using the @ operator
result = matrix1 @ matrix2
print(result)

執行上述程式碼後,我們將獲得以下輸出 -

[[19 22]
 [43 50]]

示例:使用 np.matmul() 函式

np.matmul()函式可以透過對輸入陣列的最後兩個維度執行矩陣乘法來處理具有多個維度的陣列,並根據需要廣播任何前面的維度 -

import numpy as np

# Define a 3D array and a 2D array
array_3d = np.array([[[1, 2],
                      [3, 4]],

                     [[5, 6],
                      [7, 8]]])

array_2d = np.array([[1, 0],
                     [0, 1]])

# Perform matrix multiplication using np.matmul
result = np.matmul(array_3d, array_2d)
print(result)

產生的結果如下 -

[[[1 2]
  [3 4]]

  [[5 6]
  [7 8]]]

逐元素乘法與矩陣乘法

區分逐元素乘法(使用 *)和矩陣乘法(使用 @ 或 np.dot())非常重要 -

  • 逐元素乘法 - 第一個陣列中的每個元素都乘以第二個陣列中對應的元素。

  • 矩陣乘法 - 執行行和列的點積,遵循線性代數規則。

示例

在此示例中,我們重點介紹了逐元素乘法和矩陣乘法之間的區別 -

import numpy as np

# Creating two 2D arrays
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])

# Element-wise multiplication
element_wise_result = a * b
print("Element-wise multiplication:\n", element_wise_result)

# Matrix multiplication
matrix_result = np.dot(a, b)
print("Matrix multiplication:\n", matrix_result)

我們得到如下所示的輸出 -

Element-wise multiplication:
 [[ 5 12]
 [21 32]]
Matrix multiplication:
 [[19 22]
 [43 50]]

乘以具有不同資料型別的陣列

當在 NumPy 中乘以具有不同資料型別的陣列時,會應用型別強制規則以確保可以執行運算。此過程包括在執行乘法之前將陣列轉換為通用資料型別。

NumPy 使用一組提升規則來確定結果的資料型別。一般規則是將運算元轉換為可以容納結果而不會丟失精度的型別。以下是提升順序 -

Boolean → Integer → Floating-point → Complex.

例如,整數和浮點數被提升為浮點數型別以容納小數值。

示例

在這種情況下,NumPy 將整數陣列b提升為浮點型別以匹配陣列a的資料型別 -

import numpy as np

# Creating arrays with different data types
a = np.array([1.5, 2.5, 3.5])
b = np.array([2, 3, 4], dtype=np.int32)

# Performing multiplication
result = a * b
print(result)

以下是獲得的輸出 -

[3.  7.5 14.]

處理乘法中的維度不匹配

當在 NumPy 中執行陣列之間的乘法運算時,如果陣列不共享相容的形狀,則可能發生維度不匹配。NumPy 透過廣播解決此問題,並在這種情況下引發ValueError

示例

在下面的示例中,“a”和“b”的形狀不相容廣播,導致錯誤 -

import numpy as np

# Creating arrays with incompatible shapes
a = np.array([1, 2, 3])
b = np.array([[1, 2], [3, 4]])

# Attempting to multiply incompatible arrays
result = a * b
print(result)

產生的結果如下 -

Traceback (most recent call last):File "/home/cg/root/66a1de2fae52f/main.py", line 8, in <module>result = a * bValueError: operands could not be broadcast together with shapes (3,) (2,2) 
廣告