NumPy入门:从数组基础到数学运算
目录
一、NumPy 数组基础
(一)创建数组
(二)数组索引
(三)数组切片
二、数组操作
(一)形状操作
(二)数组合并与分割
三、基本数学运算
(一)加减乘除
(二)矩阵运算
四、小结
NumPy 是 Python 中用于科学计算的核心库,提供了强大的多维数组对象和丰富的工具函数。以下是 NumPy 数组的基础知识和操作详解。
一、NumPy 数组基础
(一)创建数组
numpy.array()是最常用的创建数组方法,接受列表作为输入。同时,也可创建特殊数组,常用于初始化全零、全一、空数组、单位矩阵等数组。
import numpy as np# 使用列表创建一维数组list_1d = [1, 2, 3, 4, 5]arr_1d = np.array(list_1d)print(arr_1d) # 输出:[1 2 3 4 5]# 创建二维数组list_2d = [[1, 2, 3], [4, 5, 6]]arr_2d = np.array(list_2d)print(arr_2d) # 输出:[[1 2 3][4 5 6]]# 创建全零数组zeros = np.zeros(5)print(zeros) # 输出:[0. 0. 0. 0. 0.]# 创建全一阵列ones = np.ones((2, 3))print(ones) # 输出:[[1. 1. 1.][1. 1. 1.]]# 创建空数组,其内容是随机的,因为未初始化empty = np.empty(3)print(empty) # 输出:[随机值 随机值 随机值](具体值因系统而异)# 创建单位矩阵identity = np.eye(3)print(identity) # 输出:[[1. 0. 0.][0. 1. 0.][0. 0. 1.]]
(二)数组索引
- 一维数组索引:与 Python 列表类似,使用方括号和索引值。
- 二维数组索引:使用两个索引,分别代表行和列。
import numpy as np# 创建一维数组arr = np.array([10, 20, 30, 40, 50])# 索引 1 维数组print(arr[0]) # 输出:10print(arr[-1]) # 输出:50,索引最后一个元素# 创建 2 维数组arr_2d = np.array([[1, 2, 3], [4, 5, 6]])# 索引 2 维数组print(arr_2d[0, 1]) # 输出:2print(arr_2d[1, -1]) # 输出:6
(三)数组切片
- 一维数组切片:使用起始索引、结束索引和步长。
- 二维数组切片:可以分别对行和列进行切片。
import numpy as np# 创建一维数组arr = np.array([0, 1, 2, 3, 4, 5])# 切片 1 维数组print(arr[1:4]) # 输出:[1 2 3]print(arr[:3]) # 输出:[0 1 2]print(arr[2:]) # 输出:[2 3 4 5]print(arr[::2]) # 输出:[0 2 4]print(arr[1:5:2]) # 输出:[1 3]print(arr[::-1]) # 输出:[5 4 3 2 1],反转数组# 创建 2 维数组arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])# 切片 2 维数组print(arr_2d[:2, :2]) # 输出:[[1 2][4 5]]print(arr_2d[1:, ::2]) # 输出:[[4 6][7 9]]
二、数组操作
(一)形状操作
- 改变数组形状:reshape()方法可以改变数组的形状,但不改变其数据。
- 扁平化数组:flatten()和ravel()都可以将多维数组扁平化为一维数组,但它们在处理方式上有所不同(flatten()返回拷贝,ravel()返回视图,可能更高效)。
import numpy as np# 创建数组arr = np.array([[1, 2, 3], [4, 5, 6]])# 改变数组形状reshaped_arr = arr.reshape(3, 2)print(reshaped_arr) # 输出:[[1 2][3 4][5 6]]# 扁平化数组flattened_arr = arr.flatten()print(flattened_arr) # 输出:[1 2 3 4 5 6]# 使用 ravel 扁平化raveled_arr = arr.ravel()print(raveled_arr) # 输出:[1 2 3 4 5 6]
(二)数组合并与分割
- 水平合并:hstack()将数组水平拼接。
- 垂直合并:vstack()将数组垂直堆叠。
- 水平分割:hsplit()将数组水平分割。
- 垂直分割:vsplit()将数组垂直分割。
import numpy as np# 创建数组a = np.array([1, 2, 3])b = np.array([4, 5, 6])# 水平合并horizontal_stack = np.hstack((a, b))print(horizontal_stack) # 输出:[1 2 3 4 5 6]# 创建二维数组c = np.array([[1, 2], [3, 4]])d = np.array([[5, 6], [7, 8]])# 垂直合并vertical_stack = np.vstack((c, d))print(vertical_stack) # 输出:[[1 2][3 4][5 6][7 8]]# 创建原数组arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])# 水平分割(分成 2 份)horizontal_split = np.hsplit(arr, 2)print(horizontal_split) # 输出:[array([[1, 2],[5, 6]]), array([[3, 4],[7, 8]])]# 垂直分割(分成 2 份)vertical_split = np.vsplit(arr, 2)print(vertical_split) # 输出:[array([[1, 2, 3, 4]]), array([[5, 6, 7, 8]])]
三、基本数学运算
(一)加减乘除
- 加法:对应元素相加。
- 减法:对应元素相减。
- 乘法:对应元素相乘。
- 除法:对应元素相除。
import numpy as np# 创建数组a = np.array([1, 2, 3])b = np.array([4, 5, 6])# 加法add_result = a + bprint(add_result) # 输出:[5 7 9]# 减法subtract_result = a - bprint(subtract_result) # 输出:[-3 -3 -3]# 乘法multiply_result = a * bprint(multiply_result) # 输出:[4 10 18]# 除法divide_result = a / bprint(divide_result) # 输出:[0.25 0.4 0.5 ]
(二)矩阵运算
- 矩阵相乘:dot()方法用于矩阵乘法(需满足矩阵乘法规则,即前一矩阵的列数等于后一矩阵的行数)。
- 矩阵转置:T属性可以获得矩阵的转置。
- 矩阵求逆:linalg.inv()可以计算可逆矩阵的逆矩阵(矩阵需为方阵且行列式不为零)。
import numpy as np# 创建矩阵matrix1 = np.array([[1, 2], [3, 4]])matrix2 = np.array([[5, 6], [7, 8]])# 矩阵相乘matrix_multiply = np.dot(matrix1, matrix2)print(matrix_multiply) # 输出:[[19 22][43 50]]# 矩阵转置transpose_matrix = matrix1.Tprint(transpose_matrix) # 输出:[[1 3][2 4]]# 矩阵求逆(matrix1 的行列式为 -2,可逆)inverse_matrix = np.linalg.inv(matrix1)print(inverse_matrix) # 输出:[[-2. 1. ][ 1.5 -0.5]]
四、小结
通过以上内容,我们学习了 NumPy 数组的基本操作,包括:
- 如何创建不同维度的数组和对数组进行索引和切片
- 如何改变数组的形状和进行合并分割
- 如何进行基本的数学运算
NumPy 的核心在于其高效的数组操作能力,建议初学者多实践以上代码示例,并尝试自己创建数组进行各种操作,逐步熟悉 NumPy 的语法和功能。如果需要深入学习某个部分或补充其他内容,欢迎随时告知。