NumPy数组相对于Python数组的好处

  • Post category:Python

NumPy是Python中用于科学计算的一个库,其中最基本的部分是ndarray(N-dimensional array)对象,简称NumPy数组。相比于Python内置的列表(list)数据结构,NumPy数组具有以下好处:

  1. 快速运算:NumPy数组通过C语言的级别进行优化,可以以更快的速度对数组进行数学和逻辑运算。这对于科学计算和大规模数据处理是非常重要的。

  2. 内存效率:NumPy数组是连续储存在内存中的,不同于Python的列表,它们由指向不同对象的指针构成。这意味着NumPy数组不需要完成每个元素的存储,从而减少内存占用。

  3. 广播(Broadcasting):NumPy数组可以进行广播计算,即使它们不是完全相同的形状。在进行广播计算时,NumPy会自动地扩展数组以匹配运算。

下面有一些示例,具体说明Python数组和NumPy数组之间的区别。

  1. 取平均值:取一个长度为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倍。

  1. 矩阵乘法:计算两个矩阵的乘积。

使用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数组进行了广泛的支持,具有很好的可拓展性。