NumPy是Python中用于科学计算的一个库,其中最基本的部分是ndarray(N-dimensional array)对象,简称NumPy数组。相比于Python内置的列表(list)数据结构,NumPy数组具有以下好处:
-
快速运算:NumPy数组通过C语言的级别进行优化,可以以更快的速度对数组进行数学和逻辑运算。这对于科学计算和大规模数据处理是非常重要的。
-
内存效率:NumPy数组是连续储存在内存中的,不同于Python的列表,它们由指向不同对象的指针构成。这意味着NumPy数组不需要完成每个元素的存储,从而减少内存占用。
-
广播(Broadcasting):NumPy数组可以进行广播计算,即使它们不是完全相同的形状。在进行广播计算时,NumPy会自动地扩展数组以匹配运算。
下面有一些示例,具体说明Python数组和NumPy数组之间的区别。
- 取平均值:取一个长度为10000000的整数数组的平均值。
使用Python数组:
import random
lst = [random.randint(0, 100) for _ in range(10000000)]
average = sum(lst) / len(lst)
使用NumPy数组:
import numpy as np
arr = np.random.randint(0, 100, size=10000000)
average = arr.mean()
运行时间对比:
Python数组平均值运行时间:5.08 s
NumPy数组平均值运行时间:4.4 ms
可以看到,使用NumPy数组计算平均值的速度比使用Python数组快了将近1000倍。
- 矩阵乘法:计算两个矩阵的乘积。
使用Python数组:
import random
matrix1 = [[random.randint(0, 100) for _ in range(100)] for _ in range(100)]
matrix2 = [[random.randint(0, 100) for _ in range(100)] for _ in range(100)]
result = [[0 for _ in range(100)] for _ in range(100)]
for i in range(len(matrix1)):
for j in range(len(matrix2[0])):
for k in range(len(matrix2)):
result[i][j] += matrix1[i][k] * matrix2[k][j]
使用NumPy数组:
import numpy as np
matrix1 = np.random.randint(0, 100, size=(100, 100))
matrix2 = np.random.randint(0, 100, size=(100, 100))
result = np.dot(matrix1, matrix2)
运行时间对比:
Python矩阵乘法运行时间:5.78 s
NumPy矩阵乘法运行时间:6.92 ms
可以看到,即使对于相对较小的矩阵,使用NumPy数组也比使用Python数组快了将近100倍。
综上所述,当需要进行大量数学计算或处理大量数据时,NumPy数组的优势就很明显了。从性能上来讲,NumPy数组比Python列表要快得多,并且因为基于NumPy的科学库对NumPy数组进行了广泛的支持,具有很好的可拓展性。