Python 并没有提供数组功能,虽然列表 (list) 可以完成基本的数组功能,但它并不是真正的数组,而且在数据量较大时,使用列表的速度就会慢的让人难受。为此,Numpy 提供了真正的数组功能,以及对数据快速处理的函数。Numpy 还是很多更高级的扩展库的依赖库,例如: Scipy,Matplotlib,Pandas等。此外,值得一提的是:Numpy 内置函数处理数据的速度是 C 语言级别的,因此编写程序时,应尽量使用内置函数,避免出现效率瓶颈的现象。一切计算源于数据,那么我们就来看一看Numpy.genfromtxt 如何优雅的处理数据。
Enthought offical tutorial: numpy.genfromtxt
A very common file format for data file is comma-separated values (CSV), or related formats such as TSV (tab-separated values). To read data from such files into Numpy arrays we can use the numpy.genfromtxt function.
我们以数字示波器采集的实验产生的三角波 (triangular waveform) 为例,它是包含数据信息的表头,以 .txt 格式存储的文本文件。
Type: raw Points: 16200 Count: 1 ... X Units: second Y Units: Volt XY Data: 2.4000000E-008, 1.4349E-002 2.4000123E-008, 1.6005E-002 2.4000247E-008, 1.5455E-002 2.4000370E-008, 1.5702E-002 2.4000494E-008, 1.5147E-002 ...为了得到我们需要的有用数据,我们有两个硬的要求: (1) 跳过表头信息; (2) 区分横纵坐标。
import numpy as np data = np.genfromtxt('waveform.txt',delimiter=',',skip_header=18)delimiter: the str used to separate data. 横纵坐标以 ‘,’ 分割,因此给 delimiter 传入 ‘,’。skip_header: the number of lines to skip at the beginning of the file. 有用数据是从19行开始的,因此给 skip_header 传入 18。
print data[0:3,0], data[0:3,1]因为读入的是二维数据,因此利用 numpy 二维数据的切片方式 (Index slicing) 输出各自的前三个数据验证是否读取正确:
[ 2.40000000e-08 2.40001230e-08 2.40002470e-08] [ 0.014349 0.016005 0.015455]对数据进行归一化处理后,调用 Matplotlib 画图命令,就可得到图像如下:
import matplotlib.pyplot as plt fig, axes = plt.subplots(figsize=(8,6)) axes.plot(x, y, 'r', linewidth=3) axes.set_xlabel('Time(ps)') axes.set_ylabel('Amplitude[a.u.]') fig.savefig("triangular.png", dpi=600)补充
numpy.genformtxt( ) 函数提供了众多的入参,实现不同格式数据的读取,详情可参考:numpy.genfromtxt 此外,numpy 中还提供了将数据存储为 CSV 格式的函数 numpy.savetxt( ),详情可参考:numpy.savetxt
转载声明 作者:Lovingmylove521 链接:https://www.jianshu.com/p/82110f1dbb94