引言
NumPy是Python科学计算的核心库之一,提供了强大的多维数组对象和丰富的数学函数,是数据科学、机器学习等领域不可或缺的工具。结合Jupyter Notebook的交互式环境,NumPy的使用变得更加直观和高效。本文将介绍如何在Jupyter中充分利用NumPy进行科学计算。
一. 搭建 Jupyter 与 NumPy 协同舞台
NumPy是第三方库,需要先安装才能使用:
Windows系统:
打开cmd(在菜单栏搜索cmd)
输入命令:
pip install numpy
或pip3 install numpy
MacOS系统:
打开终端(点击顶部菜单栏放大镜图标,输入"终端"或"terminal")
输入同样的安装命令
然后在Jupyter中导入NumPy:
import numpy as np
二. 深入剖析 NumPy 的 NDarray 核心
NumPy里最核心的的数据结构叫 ND array(N维数组) 如图:
1. 拆解 NumPy 数组与 Python 列表异同
1.1 相似之处
都可以通过索引获取元素
都可以通过切片获取子集
都可以迭代元素
1.2 不同之处
类型一致性:NumPy数组要求所有元素必须是同一类型(如全数字或全字符串),而Python列表没有这个限制
性能优势:对NumPy数组进行大规模数学运算时,执行速度远高于Python内置列表
丰富功能:NumPy提供了大量专门用于数值运算的函数(如求平均值、标准差等)
总结
特性 | ndarray | Python列表 |
---|---|---|
元素类型 | 必须一致 | 可以混合 |
内存占用 | 更小 | 更大 |
运算速度 | 更快 | 较慢 |
内置方法 | 丰富的数学运算 | 基本列表操作 |
2. 探索 NumPy 数组的多样创建路径
2.1 基本创建方法
最直观的方法是使用np.array()
将列表转换为数组:
#一维数组
arr1 = np.array([1, 2, 3])
arr1
#二维数组
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
arr2
维度判断技巧:观察最左边有几个方括号,就是几维数组。
技巧:
嵌套列表创建多维数组
最外层方括号数量决定数组维度
注意:虽然可以传入不同类型的元素,但array()
方法会强制将它们转换为同一类型,因此最好一开始就传入同类型元素。如:
np.array(["hello", True, 3.14])
2.2 解锁 NumPy 数组关键属性奥秘
NumPy数组有几个重要属性:
# 创建一个示例数组
arr = np.array([[1, 2, 3], [4, 5, 6]])
print("维度数(ndim):", arr.ndim) # 2
print("形状(shape):", arr.shape) # (2, 3) - 表示2行3列
print("元素总数(size):", arr.size) # 6
print("元素类型(dtype):", arr.dtype) # int64
效果展示:
ndim
:返回数组的维度数shape
:返回表示各维度大小的元组size
:返回数组元素总数dtype
:返回数组元素类型(如int64表示64位整数)
注意:
单元素元组用逗号表示,如(7,)
shape元组中数字表示各维度大小
int表示整数
64表示64位存储空间
不同电脑可能显示int32或int64
结束值不被包含,所以用21才能包含20
步长2确保只选择偶数
2.3 挖掘 NumPy 便捷数组创建方法宝藏
NumPy提供了多种便捷的数组创建方法:
# 全零数组
zeros = np.zeros(5) # 创建长度为5的全零数组
print(zeros)
# 全一数组
ones = np.ones((2, 3)) # 创建2x3的全一数组
print(ones)
# 类似range的arange
seq = np.arange(5, 10, 2) # 从5开始,到10结束(不含),步长为2
print(seq)
效果展示:
注意:zeros()
和ones()
默认创建浮点数数组(数字后有小数点)
三、使用数组练习
建议做完再看答案
答案
写出导入numpy的语句,并且给numpy别名为np。
import numpy as np
创建一个变量名为
arr1
的一维数组,里面的元素为整数6、2、-7、2、8、-2、1。arr1 = np.array([6, 2, -7, 2, 8, -2, 1])
创建一个变量名为
arr2
的二维数组,里面的元素为以下两个数组:由整数1、3、5组成的一维数组,以及由整数2、4、6组成的一维数组。arr2 = np.array([[1, 3, 5], [2, 4, 6]])
分别打印
arr1
和arr2
的维度、形状、元素数量、元素类型。arr1 = np.array([6, 2, -7, 2, 8, -2, 1]) arr1
分别打印
arr1
和arr2
的维度、形状、元素数量、元素类型。print(arr1.ndim) print(arr2.ndim) print(arr1.shape) print(arr2.shape) print(arr1.size) print(arr2.size) print(arr1.dtype) print(arr2.dtype)
创建一个变量名为
arr_all_0
的一维数组,里面的元素为6个0。arr_all_0 = np.zeros(6) print(arr_all_0)
创建一个变量名为
arr_all_1
的一维数组,里面的元素为6个1。arr_all_1 = np.ones(6) print(arr_all_1)
创建一个变量名为
arr_even
的一维数组,里面的元素为10(包括10)到20(包括20)之间的偶数。arr_even = np.arange(10, 21, 2) print(arr_even)
四、NumPy核心操作全解析
4.1 数组拼接:灵活组合数据
(1) 基础拼接方法
import numpy as np
# 创建示例数组
arr1 = np.zeros(3) # [0., 0., 0.]
arr2 = np.array([7, 8, 9]) # [7, 8, 9]
# 使用concatenate拼接
combined = np.concatenate([arr1, arr2])
print(combined) # 输出: [0. 0. 0. 7. 8. 9.]
关键点解析:
类型统一:浮点数和整数拼接时,结果会自动转为浮点数
多数组拼接:
np.concatenate([arr1, arr2, arr3, ...])
维度一致:所有输入数组必须维度相同
(2)多维数组拼接
# 创建2D数组
arr2d_1 = np.array([[1, 2], [3, 4]])
arr2d_2 = np.array([[5, 6], [7, 8]])
# 垂直拼接(沿axis=0)
vertical = np.concatenate([arr2d_1, arr2d_2], axis=0)
"""
[[1 2]
[3 4]
[5 6]
[7 8]]
"""
# 水平拼接(沿axis=1)
horizontal = np.concatenate([arr2d_1, arr2d_2], axis=1)
"""
[[1 2 5 6]
[3 4 7 8]]
"""
关键点和一维相同
4.2数组排序:两种方式对比
(1)返回新数组的np.sort()
arr = np.array([3, 1, 4, 2])
sorted_arr = np.sort(arr) # 返回新数组
print(sorted_arr) # [1 2 3 4]
print(arr) # 原数组不变: [3 1 4 2]
(2)原地排序的arr.sort()
arr = np.array([3, 1, 4, 2])
arr.sort() # 直接修改原数组
print(arr) # [1 2 3 4]
应用场景选择:
需要保留原始数据时 →
np.sort()
内存有限或不需要原始数据时 →
arr.sort()
4.3 索引与切片:精准数据访问
(1)基础索引技巧
arr = np.array([10, 20, 30, 40, 50])
# 正索引
print(arr[0]) # 10 (第一个元素)
print(arr[2]) # 30
# 负索引
print(arr[-1]) # 50 (最后一个)
print(arr[-3]) # 30
(2) 灵活切片操作
# 基本切片
print(arr[1:4]) # [20 30 40] (索引1到3)
print(arr[:3]) # [10 20 30] (前三个)
print(arr[2:]) # [30 40 50] (索引2到最后)
# 带步长的切片
print(arr[::2]) # [10 30 50] (每隔一个元素)
五、NumPy高级特性揭秘
5.1. 广播机制解析
广播机制是NumPy最强大的特性之一,允许不同形状数组进行数学运算:NumPy自动将标量"广播"到数组每个元素执行运算
类似线性代数向量和标量相乘,运算时,标量会运用在数组的每一个数字上,如下图:
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(a + b) # [5 7 9] (对应元素相加)
print(a * b) # [4 10 18] (对应元素相乘)
5.2 聚合运算:数据摘要统计
data = np.array([5, 2, 9, 1, 7])
# 常用聚合操作
print("最大值:", data.max()) # 9
print("最小值:", data.min()) # 1
print("总和:", data.sum()) # 24
print("平均值:", data.mean()) # 4.8
print("标准差:", data.std()) # 约2.993
5.3 条件筛选:智能数据过滤
(1)基础条件筛选
arr = np.array([3, 7, 2, 9, 5, 1])
# 简单条件
print(arr[arr > 5]) # [7 9]
print(arr[arr % 2 == 0]) # [2]
运行机制如下:
当数组与标量进行比较时,NumPy的广播机制会将比较运算自动应用到每个元素上,生成一个布尔值数组。这个布尔数组可以作为掩码来筛选原数组:
arr = np.array([3, 7, 2, 9, 5])
mask = arr > 6 # 生成布尔数组 [False, True, False, True, False]
result = arr[mask] # 筛选出True位置的元素 [7, 9]
关键点:
比较操作会广播到每个元素
返回的布尔数组与原数组形状相同
布尔索引只保留对应True位置的元素
(2)复合条件筛选
# 使用逻辑运算符
print(arr[(arr > 3) & (arr < 7)]) # [5] (大于3且小于7)
print(arr[(arr < 2) | (arr > 8)]) # [9 1] (小于2或大于8)
print(arr[~(arr > 4)]) # [3 2 1] (不大于4)
逻辑运算符对照表:
Python运算符 | NumPy运算符 |
---|---|
and | & |
or | | |
not | ~ |
六、操作数组的不同方法练习
答案:
写出导入numpy的语句,并且给numpy别名为np。
import numpy as np
创建arr1为包含了元素1、3、2、4、9的数组,创建arr2为长度为5的由1组成的一维数组,arr3为长度为3的由0组成的一维数组。
arr1 = np.array([1, 3, 2, 4, 9]) arr2 = np.ones(5) arr3 = np.zeros(3)
创建数组arr4,包括所有arr1、arr2、arr3里面的数字,并输出。
arr4 = np.concatenate([arr1, arr2, arr3]) arr4
更改arr1,对arr1里的元素进行排序,并输出排序后的结果。
arr1.sort() arr1
用两种方法打印arr1的第三个元素。
print(arr1[2]) print(arr1[-3])
输出从arr1第2个元素到第4个元素组成的的数组。
arr1[1:4]
输出arr1与arr2的同位置元素相加后组成的数组。
arr1 + arr2
输出arr1的各个元素乘以-5后组成的数组。
arr1 * -5
打印arr1数组的最大值、最小值、和、平均值。
print(arr1.max()) print(arr1.min()) print(arr1.sum()) print(arr1.mean())
筛选出arr1数组里所有小于1或大于3的数字,并打印出来。
arr1[(arr1 < 1)|(arr1 > 3)]