一、什么是Numpy?¶
在Python的数值计算世界里,Numpy是一个核心库。它提供了高性能的多维数组对象,以及一系列用于处理这些数组的工具。相比Python原生的列表,Numpy数组能更高效地进行数值运算,尤其适合数据科学、机器学习、科学计算等场景。如果你接触过Excel表格、矩阵运算,或者想处理大量数据,Numpy会是你的得力助手。
二、安装与导入¶
首先,确保你安装了Numpy。如果还没安装,可以用pip命令:
pip install numpy
在代码中导入Numpy(通常简写为np):
import numpy as np
三、创建Numpy数组¶
Numpy数组是处理数据的基本单位,我们先看看如何创建数组。
1. 从Python列表创建数组¶
最简单的方式是用np.array(),传入一个列表即可生成数组:
# 一维数组
arr1 = np.array([1, 2, 3, 4])
print(arr1) # 输出:[1 2 3 4]
# 二维数组(列表的列表)
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2)
# 输出:
# [[1 2 3]
# [4 5 6]]
2. 使用Numpy内置函数创建数组¶
Numpy提供了很多快捷函数,适合生成特定结构的数组:
- 全0数组:
np.zeros(shape, dtype=float)
zeros_arr = np.zeros((3, 4)) # 形状为(3,4)的全0数组
print(zeros_arr)
# 输出:
# [[0. 0. 0. 0.]
# [0. 0. 0. 0.]
# [0. 0. 0. 0.]]
- 全1数组:
np.ones(shape, dtype=float)
ones_arr = np.ones((2, 2)) # 形状为(2,2)的全1数组
print(ones_arr)
# 输出:
# [[1. 1.]
# [1. 1.]]
- 等差数列:
np.arange(start, end, step)(类似Python的range)
arange_arr = np.arange(0, 10, 2) # 从0开始,步长2,到10结束(不包含10)
print(arange_arr) # 输出:[0 2 4 6 8]
- 均匀分布数组:
np.linspace(start, end, num)(生成num个均匀分布的数)
linspace_arr = np.linspace(0, 10, 5) # 生成5个数,从0到10均匀分布
print(linspace_arr) # 输出:[ 0. 2.5 5. 7.5 10. ]
- 随机数组:
np.random系列函数(如正态分布、均匀分布)
# 生成3x3的标准正态分布随机数组(均值0,标准差1)
rand_arr = np.random.randn(3, 3)
print(rand_arr)
四、数组的基础属性¶
了解数组的属性能帮你快速掌握它的结构。常见属性有:
shape:数组的形状(维度)ndim:数组的维度数量dtype:数组元素的数据类型size:数组元素的总数
示例:
arr = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.int32) # 指定数据类型为整数
print("形状:", arr.shape) # 输出:(2, 3)(2行3列)
print("维度:", arr.ndim) # 输出:2(二维数组)
print("数据类型:", arr.dtype) # 输出:int32
print("元素总数:", arr.size) # 输出:6(2×3=6)
五、数组的索引与切片¶
数组的索引和切片是访问元素的核心操作,类似Python列表但更灵活。
1. 一维数组¶
arr = np.array([1, 3, 5, 7, 9])
print(arr[0]) # 访问第一个元素:1
print(arr[-1]) # 访问最后一个元素:9
print(arr[1:4]) # 切片:从索引1到4(不包含4):[3, 5, 7]
2. 二维数组¶
二维数组可以理解为“表格”,用逗号分隔行和列的索引:
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr[0, 1]) # 第0行第1列:2
print(arr[1, :]) # 第1行所有列:[4 5 6]
print(arr[:, 2]) # 所有行第2列:[3 6 9]
print(arr[0:2, 1:3]) # 切片:前2行,后2列(左闭右开)
# 输出:
# [[2 3]
# [5 6]]
3. 布尔索引(按条件筛选)¶
用布尔数组作为索引,筛选出满足条件的元素:
arr = np.array([1, 3, 5, 7, 9])
mask = arr > 3 # 生成布尔数组:[False, False, True, True, True]
print(arr[mask]) # 输出:[5 7 9](筛选出大于3的元素)
六、数组的基础运算¶
Numpy数组支持高效的元素级运算和矩阵运算,比Python列表的运算更简洁。
1. 算术运算(元素级操作)¶
Numpy数组的算术运算符(+, -, *, /等)是元素级的,即每个元素独立运算:
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
print(arr1 + arr2) # 元素相加:[5, 7, 9]
print(arr1 * arr2) # 元素相乘:[4, 10, 18]
print(arr1 / arr2) # 元素相除:[0.25, 0.4, 0.5]
⚠️ 注意:Python列表的+是拼接(如[1,2]+[3,4]=[1,2,3,4]),而Numpy数组的+是元素相加。
2. 矩阵运算(线性代数)¶
- 矩阵乘法:用
np.dot()或@运算符(对应数学中的矩阵乘法)
A = np.array([[1, 2], [3, 4]]) # 2x2矩阵
B = np.array([[5, 6], [7, 8]]) # 2x2矩阵
C = A @ B # 矩阵乘法:A×B
print(C)
# 输出:
# [[19 22]
# [43 50]]
- 点积:
np.dot(a, b)计算两个向量的点积(标量)
v1 = np.array([1, 2, 3])
v2 = np.array([4, 5, 6])
print(np.dot(v1, v2)) # 1×4 + 2×5 + 3×6 = 4 + 10 + 18 = 32
3. 广播机制(不同形状数组的运算)¶
当运算的数组形状不同时,Numpy会自动“广播”(扩展)小数组以匹配大数组合法运算。常见场景:
- 数组与标量运算:标量会自动扩展到数组的每个元素
arr = np.array([1, 2, 3])
print(arr + 2) # 每个元素加2:[3, 4, 5]
- 形状兼容的数组:维度为1的轴会被扩展
arr1 = np.array([[1, 2, 3], [4, 5, 6]]) # 2x3数组
arr2 = np.array([10, 20, 30]) # 1x3数组(等价于[10,20,30])
print(arr1 + arr2) # 每行分别加arr2:
# [[11 22 33]
# [14 25 36]]
七、简单应用示例¶
1. 数组统计分析¶
Numpy内置了大量统计函数,快速计算数组的关键指标:
arr = np.array([1, 2, 3, 4, 5])
print("总和:", arr.sum()) # 15
print("均值:", arr.mean()) # 3.0
print("标准差:", arr.std()) # 1.4142...
print("最大值:", arr.max()) # 5
print("最小值:", arr.min()) # 1
2. 数据筛选与处理¶
结合索引和布尔运算,快速筛选异常值:
data = np.array([10, 5, 20, 8, 15])
# 筛选出大于10的元素
filtered = data[data > 10]
print(filtered) # 输出:[10, 20, 15](注意:10也大于10,包含在内)
八、总结与练习¶
Numpy是Python数值计算的基石,掌握它能极大提升数据处理效率。关键知识点回顾:
- 数组创建:从列表、zeros/ones/arange/linspace等
- 数组属性:shape、ndim、dtype、size
- 索引切片:一维/二维数组、布尔索引
- 基础运算:元素级算术、矩阵乘法、广播机制
练习建议:
1. 尝试生成不同形状的随机数组,并计算其均值、方差
2. 用Numpy实现简单的矩阵乘法(3x3矩阵×3x2矩阵)
3. 对二维数组进行切片,提取子矩阵并计算和
通过以上内容,你已经能初步掌握Numpy的基础操作。后续可以探索更高级的功能,如线性代数、傅里叶变换等,进一步提升数值计算能力!