原文:
www.kdnuggets.com/how-to-perform-matrix-operations-with-numpy
图片由 Vlado Paunovic 提供
NumPy 是一个强大的 Python 库,包含大量数学函数,并支持创建可以应用这些数学函数的矩阵和多维数组。
1. 谷歌网络安全证书 - 快速进入网络安全职业生涯。
2. 谷歌数据分析专业证书 - 提升你的数据分析技能
3. 谷歌 IT 支持专业证书 - 支持你的组织 IT
在这个简短的教程中,你将学习如何使用 NumPy 执行几种最基本的矩阵操作。
在 NumPy 中,矩阵被定义为一种专门的数组,严格为二维,并且在应用数学操作后保持其二维性。此类型的矩阵可以使用 np.matrix
类实现,但 NumPy 不再推荐使用此类,因为它可能在将来被移除。NumPy 推荐的替代选项是使用 N 维数组类型 ndarray
。
在 NumPy 中,ndarray 和矩阵的主要区别在于前者可以是任何维度的,并且其使用不局限于二维操作。
因此,在本教程中,我们将重点实施对二维数组的几种基本矩阵操作,这些数组是使用 np.ndarray
创建的。
首先导入 NumPy 包,然后创建两个由两行三列组成的二维数组。这些数组将在本教程的后续示例中使用:
# Import NumPy package
import numpy as np
# Create arrays
a1 = np.array([[0, 1, 0], [2, 3, 2]])
a2 = np.array([[3, 4, 3], [5, 6, 5]])
shape
属性让我们确认数组的维度:
# Print one of the arrays
print('Array 1:', '\n', a1, '\n Shape: \n’, a1.shape)
输出:
Array 1:
[[0 1 0]
[2 3 2]]
Shape: (2, 3)
NumPy 提供了自己的函数来执行数组的逐元素加法、减法、除法和乘法。此外,NumPy 还通过扩展 Python 的算术运算符的功能来处理逐元素数组操作。
以数组 a1
和 a2
之间的逐元素加法为例开始。
通过使用 np.add
函数或重载的 +
运算符,可以实现两个数组的逐元素加法:
# Using np.add
func_add = np.add(a1, a2)
# Using the + operator
op_add = a1 + a2
通过打印结果,可以确认它们都产生了相同的输出:
# Print results
print('Function: \n', func_add, '\n\n', 'Operator: \n', op_add)
输出:
Function:
[[3 5 3]
[7 9 7]]
Operator:
[[3 5 3]
[7 9 7]]
然而,如果我们对它们进行计时,会发现一点小差异:
import numpy as np
import timeit
def func():
a1 = np.array([[0, 1, 0], [2, 3, 2]])
a2 = np.array([[3, 4, 3], [5, 6, 5]])
np.add(a1, a2)
def op():
a1 = np.array([[0, 1, 0], [2, 3, 2]])
a2 = np.array([[3, 4, 3], [5, 6, 5]])
a1 + a2
# Timing the functions over 100000 iterations
func_time = timeit.timeit(func, number=100000)
op_time = timeit.timeit(op, number=100000)
# Print timing results
print('Function:', func_time, '\n', 'Operator:', op_time)
输出:
Function: 0.2588757239282131
Operator: 0.24321464297827333
在这里可以看到,NumPy 的np.add
函数的性能略低于+
运算符。这主要是因为 add 函数引入了类型检查,将任何类似数组的输入(如列表)转换为数组,然后再进行加法操作。这也就带来了额外的计算开销,相较于+
运算符。
然而,这种措施也使得np.add
函数更不容易出错。例如,将np.add
应用于list
类型的输入仍然有效(例如np.add([1, 1], [2, 2])
),而使用+
运算符则会导致列表连接。
同样,对于逐元素减法(使用np.subtract
或-
),除法(使用np.divide
或/
)和乘法(使用np.multiply
或*
),NumPy 函数会进行类型检查,引入少量计算开销。
其他几个可能有用的操作包括转置和乘法数组。
矩阵转置会导致矩阵的正交旋转,可以使用np.transpose
函数(它包含类型检查)或.T
属性来实现:
# Using np.transpose
func_a1_T = np.transpose(a1)
# Using the .T attribute
att_a1_T = a1.T
矩阵乘法可以使用np.dot
函数或@
运算符(后者从 Python 3.5 开始实现了np.matmul
函数):
# Using np.dot
func_dot = np.dot(func_a1_T, a2)
# Using the @ operator
op_dot = func_a1_T @ a2
在处理二维数组时,np.dot
和np.matmul
的表现是一样的,并且都包含类型检查。
Stefania Cristina,博士,是马耳他大学系统与控制工程系的高级讲师。她的研究兴趣集中在计算机视觉和机器学习领域。