矩阵计算和 NumPy
NumPy(Numerical Python的缩写)是一个开源的 Python 库,广泛应用于科学计算中,特别是在数组计算、线性代数、傅里叶变换和随机数生成等领域。它提供了一个强大的 N 维数组对象和大量用于操作这些数组的函数和工具。很多高级科学计算工具包,比如 Pandas、Matplotlib 等都是基于 NumPy 的。
安装
NumPy 是个第三方包,如果还没有安装NumPy,可以通过以下命令安装:
pip install numpy
使用 NumPy 功能先要导入:
import numpy as np
下面示例代码,有些省略了导入过程了,测试时需要自行添加。
数组
NumPy 的核心特性之一是其 N 维数组(ndarray)对象。这是一个快速、灵活的大数据集容器。与 Python 原生的列表相比,NumPy 的数组更加高效,支持更高级的数学运算。下面是一些常用的数组操作。
创建数组
使用 np.array 函数,可以把其它类型的数据转换成 NumPy 数组:
# 把列表转换成数组
np_array = np.array([1, 2, 3, 4, 5])
# 把图片转换成二维数组
from PIL import Image
image = Image.open("example.jpg")
image_array = np.array(image)
使用 np.zeros,np.ones 函数可以创建特定大小的全零或全一数组:
zeros_array = np.zeros((2, 3)) # 创建一个 2x3 的零矩阵
ones_array = np.ones((3, 4)) # 创建一个 3x4 的单位矩阵
range_array = np.arange(10) # 创建一个元素值从 0 到 9 的数组
random_array = np.random.randint(0, 10, (3, 4)) # 创建一个 3x4 的矩阵,元素都是 0 到 9 的随机整数
数组形状和大小
shape 属性表示了数组形状:
import numpy as np
ones_array = np.ones((3, 4))
print(ones_array.shape) # 输出: (3, 4)
reshape 可以改变数组形状:
import numpy as np
# 创建一个一维数组
arr = np.arange(10) # 这将创建一个包含数字0到9的数组
print("原始数组:")
print(arr)
# 使用reshape将其重新排列成一个2x5的二维数组
reshaped_arr = arr.reshape((2, 5))
print("\n重塑后的二维数组:")
print(reshaped_arr)
# 也可以让NumPy自动计算其中一个维度的大小
# 下面的-1表示自动计算该维度的大小
reshaped_arr_2 = arr.reshape((5, -1))
print("\n自动计算维度的重塑数组:")
print(reshaped_arr_2)
输出:
原始数组:
[0 1 2 3 4 5 6 7 8 9]
重塑后的二维数组:
[[0 1 2 3 4]
[5 6 7 8 9]]
自动计算维度的重塑数组:
[[0 1]
[2 3]
[4 5]
[6 7]
[8 9]]
索引和切片
NumPy 一维数组索引方式与列表索引相同:
element = np_array[0] # 获取第一个元素
但是二维或更高维就不同了,对于二维数组(矩阵),索引方式通常是 array[row, column]:
# 创建一个 3x3 的二维数组
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 访问第二行第三列的元素
print(arr[1, 2]) # 输出 6
NumPy 数组同样支持切片操作,规则与列表的切片相同:
# 访问第二行
print(arr[1, :]) # 输出 [4 5 6]
# 访问第三列
print(arr[:, 2]) # 输出 [3 6 9]
# 访问子矩阵(前两行,前两列)
print(arr[:2, :2]) # 输出 [[1 2] [4 5]]
NumPy 支持整数数组索引,可用来索引另一个数组:
print(arr[[0, 2], [1, 2]])
# 输出 [2 9] 也就是索引了两个数 arr[0, 1] 和 arr[2, 2]