本文主要介绍Python中,使用NumPy处理数据,相对于传统的Python的list列表的优势,以及相关的示例代码。

1、占用空间和读取速度

NumPy数组是更紧凑的Python列表,列表的列表描述同样的数据,在Python中,可能至少需要20 MB左右,而单元格中具有单精度浮点数的NumPy 3D数组可以容纳4MB。读写数据NumPy也更快。

一个Python列表是一个Python对象的指针数组,至少4个字节指针+ 16字节甚至最小的Python对象。NumPy数组是一个统一值的数组——单精度数字每个4字节,双精度数字每个8字节。不太灵活,但是标准Python列表的灵活性会占用更大的内存空间。

2、使用NumPy处理数据更方便

NumPy不仅更高效,而且也更方便。可以容易得到很多向量和矩阵运算。

例如,

可以直接将多维数据集从文件读入array

import numpy 
x = numpy.fromfile(file=open("data"), dtype=float).reshape((100, 100, 100))
# 可以按第二维度求和:
s = x.sum(axis=1)
# 找出高于阈值的数据:
(x > 0.5).nonzero()
# 删除第三维上的每个偶数索引片:
x[:, :, ::2]

注意:许多有用的库都适用于 NumPy 数组。例如,统计分析和可视化库。即使你没有性能问题,学习 NumPy是很有用的。

3、list列表和 NumPy数组速度测试

列表和 NumPy 数组进行求和的测试,表明 NumPy 数组上的求和速度快 10 倍,

例如,

from numpy import arange
from timeit import Timer
Nelements = 10000
Ntimeits = 10000
x = arange(Nelements)
y = range(Nelements)
t_numpy = Timer("x.sum()", "from __main__ import x")
t_list = Timer("sum(y)", "from __main__ import y")
print("numpy: %.3e" % (t_numpy.timeit(Ntimeits)/Ntimeits,))
print("list: %.3e" % (t_list.timeit(Ntimeits)/Ntimeits,))

输出结果:

numpy: 7.599e-06
list: 6.382e-05

4、使用区别

1)与 Python 列表(可以动态增长)不同,Numpy 数组在创建时具有固定大小。更改 ndarray 的大小将创建一个新数组并删除原始数组。

2)NumPy 数组中的元素都需要具有相同的数据类型(我们也可以使用异构类型,但这将不允许进行数学运算),因此内存中的大小相同。

3)NumPy 数组有助于对大量数据进行数学运算和其他类型的运算。通常,与使用 Python list列表等相比,此类操作的执行效率更高,代码更少。

推荐文档