numpy(1)_入门

1 NumPy快速入门-安装 2 体验NumPy中的数组对象

Posted by Hilda on January 27, 2025

NumPy(Numerical Python)是进行科学计算、数据分析和机器学习的基础之一。NumPy 提供了强大的多维数组对象和大量数学函数,能够高效处理大量数据,是学习数据科学和机器学习的重要工具。


参考书籍:Python数据分析基础教程:NumPy学习指南(第2版)

image-20250127215537961

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__

image-20250127220039077

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

image-20250127222534648

如果用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

image-20250127222804235

上面的vector_addition_numpy函数中,避免了使用for循环。—–>简洁

除了简洁之外,很重要的一点是:NumPy在数组操作上的效率优于纯Python代码!!!

使用https://kirsten-1.github.io/2025/01/27/IPython/中提到的魔法命令%time来测试下时间:

image-20250127223427274

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)

可以得出结论:

  1. 从执行时间的对比来看,NumPy 版本的代码比纯 Python 版本的代码执行得更快。NumPy 能够提供更高的性能,特别是在处理大规模数据时,NumPy 提供了更优化的底层实现,能够加速运算。
  2. 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) 会生成一个包含从 04(共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()

image-20250127224142819