NumPy(Numerical Python)是进行科学计算、数据分析和机器学习的基础之一。NumPy 提供了强大的多维数组对象和大量数学函数,能够高效处理大量数据,是学习数据科学和机器学习的重要工具。
参考书籍:Python数据分析基础教程:NumPy学习指南(第2版)
github一搜就有这本书的PDF
主要先以这本书为路线学习numpy.
1 NumPy快速入门-安装
环境是Jupyter notebook.
首先学习前,搭建好环境:
1 2 workon env1 jupyter notebook
安装numpy,导入以及查看版本:
1
2
3
!pip install numpy
import numpy as np
np.__version__
2 体验NumPy中的数组对象
NumPy数组在数值运算方面的效率优于Python提供的list容器。使用NumPy可以在代码中省去很多循环语句,因此其代码比等价的Python代码更为简洁。
通过例子体会:
假设我们需要对两个向量a和b做加法。这里的向量即数学意义上的一维数组。
向量a的取值为0~n
的整数的平方,例如n取3时,向量a为0、1或4。向量b的取值为0~n
的整数的立方,例如n取3时,向量b为0、1或8。用纯Python 代码应该怎么写呢?
1
2
3
4
5
def vector_addition(n):
a = [i**2 for i in range(n)]
b = [i**3 for i in range(n)]
c = [a[i] + b[i] for i in range(n)]
return a,b,c
如果用numpy:
1
2
3
4
5
def vector_addition_numpy(n):
a = np.arange(n) ** 2
b = np.arange(n) ** 3
c = a + b
return a,b,c
上面的
vector_addition_numpy
函数中,避免了使用for循环。—–>简洁
除了简洁之外,很重要的一点是:NumPy在数组操作上的效率优于纯Python代码!!!
使用https://kirsten-1.github.io/2025/01/27/IPython/中提到的魔法命令%time
来测试下时间:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def vector_addition(n):
a = [i**2 for i in range(n)]
b = [i**3 for i in range(n)]
c = [a[i] + b[i] for i in range(n)]
return a,b,c
n = 3
%time a,b,c = vector_addition(n)
print("向量a",a)
print("向量b",b)
print("向量a+向量b",c)
========================================
def vector_addition_numpy(n):
a = np.arange(n) ** 2
b = np.arange(n) ** 3
c = a + b
return a,b,c
n1 = 3
%time a1,b1,c1 = vector_addition(n)
print("向量a",a1)
print("向量b",b1)
print("向量a+向量b",c1)
可以得出结论:
- 从执行时间的对比来看,NumPy 版本的代码比纯 Python 版本的代码执行得更快。NumPy 能够提供更高的性能,特别是在处理大规模数据时,NumPy 提供了更优化的底层实现,能够加速运算。
- numpy更简洁。纯 Python 代码:需要使用列表推导式和
for
循环来手动实现向量加法。NumPy 代码:通过 NumPy 的广播机制,直接使用+
运算符进行向量加法,代码更简洁且执行效率更高。
补充:NumPy 能够通过其底层优化和向量化操作显著提升性能,比纯 Python 的实现更快。(以后详细学习)
书上P11有一道题:
突击测验:arange函数的功能 问题1 arrange(5)的作用是什么? (1) 创建一个包含5个元素的Python列表(list),取值分别为1~5的整数
(2) 创建一个包含5个元素的Python列表,取值分别为0~4的整数
(3) 创建一个包含5个元素的NumPy数组,取值分别为1~5的整数
(4) 创建一个包含5个元素的NumPy数组,取值分别为0~4的整数
(5) 以上都不对
应该正确答案是(4),
np.arange(5)
会生成一个包含从0
到4
(共5个元素)的整数的 NumPy 数组,具体来说是[0, 1, 2, 3, 4]
。
勇敢出发:进一步分析 我们用来比较NumPy和常规Python代码运行速度的程序不是特别严谨,如果将相同的实验重复多次并计算相应的统计量(如平均运行时间等)会更科学。你可以把实验结果绘制成图表,并展示给你的好友和同事。
例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import time
import matplotlib.pyplot as plt
# 定义函数:常规Python实现
def vector_addition(n):
a = [i**2 for i in range(n)]
b = [i**3 for i in range(n)]
c = [a[i] + b[i] for i in range(n)]
return a, b, c
# 定义函数:NumPy实现
def vector_addition_numpy(n):
a = np.arange(n) ** 2
b = np.arange(n) ** 3
c = a + b
return a, b, c
# 测试不同n值的运行时间
n_values = range(1, 1001, 50) # n值从1到1000,步长为50
python_times = []
numpy_times = []
# 重复多次实验并计算平均运行时间
for n in n_values:
# 测量常规Python实现的时间
python_durations = []
for _ in range(10): # 重复10次
start_time = time.time()
vector_addition(n)
end_time = time.time()
python_durations.append(end_time - start_time)
python_times.append(np.mean(python_durations)) # 计算平均时间
# 测量NumPy实现的时间
numpy_durations = []
for _ in range(10): # 重复10次
start_time = time.time()
vector_addition_numpy(n)
end_time = time.time()
numpy_durations.append(end_time - start_time)
numpy_times.append(np.mean(numpy_durations)) # 计算平均时间
# 绘制实验结果
plt.figure(figsize=(10, 6))
plt.plot(n_values, python_times, label='Python (List)', marker='o')
plt.plot(n_values, numpy_times, label='NumPy', marker='s')
plt.xlabel('n (Size of Vectors)')
plt.ylabel('Average Time (seconds)')
plt.title('Performance Comparison: Python vs NumPy (Vector Addition)')
plt.legend()
plt.grid(True)
plt.show()