NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
NumPy 实现了多维同质数组和矩阵,这些数据结构不但能处理数字,还能存放其他由用户定义的记录。通过 NumPy,用户能对这些数据结构里的元素进行高效的操作。
NumPy 是一个运行速度非常快的数学库,主要用于数组计算,包含:
上面提到了ndarray,那ndarray又是什么呢?
NumPy 最重要的一个特点就是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。
ndarray 作用:
ndarray 内部的内容组成:
继续说回NumPy,使用NumPy,开发人员可以执行以下操作:
NumPy 通常与 SciPy(Scientific Python)和 Matplotlib(绘图库)一起使用, 这种组合广泛用于替代 MatLab,是一个强大的科学计算环境,有助于我们通过 Python 学习数据科学或者机器学习。
SciPy 是一个开源的 Python 算法库和数学工具包,专为线性代数、数值积分和统计学而设计。Scipy是一个用于数学、科学、工程领域的常用软件包,可以处理插值、积分、优化、图像处理、常微分方程数值解的求解、信号处理等问题。SciPy 包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。它用于有效计算Numpy矩阵,使Numpy和Scipy协同工作,高效解决问题。
SciPy 是基于 NumPy 的一个库,它提供了许多的操作numpy的数组的函数。所以SciPy就是用来操作计算Numpy中的数组的,但Numpy是能够存储数组,本身又能够进行计算,但是计算操作不够全面,所以两个库共同使用。
结合例子学习相关用法。
eg:
>>> import numpy #安装 NumPy 之后,导入它(NumPy 并不是 Python 标准库的一部分)
>>> a = numpy.arange(12) #新建一个 0~11 的整数的numpy.ndarry,然后把它打印出来;numpy.arange()用法有在下面说哟~
>>> a
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) #是ndarray对象
>>> type(a)
<class 'numpy.ndarray'>
>>> a.shape #看看查看矩阵或者数组的维数,这个例子中返回的是一个一维的、有 12 个元素的数组
(12,)
>>> a.shape = 3, 4 #把数组变成二维的,然后把它打印出来看看,就是重新设置了行数和列数,然后在原来的序列中重新分配数据生成ndarray对象
>>> a
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> a[2] #打印出第 2 行,这里的规则和列表的原则相同,也是从0开始算的,说是第2行,实际是我们看到的第三行
array([ 8, 9, 10, 11])
>>> a[2, 1] #打印第 2 行第 1 列的元素,这里原理同上
9
>>> a[:, 1] #把第 1 列打印出来。指取ndarray对象中的所有行(行就相当于各个序列)的第二个元素
array([1, 5, 9])
>>> a.transpose() #把行和列交换,就得到了一个新数组
array([[ 0, 4, 8],
[ 1, 5, 9],
[ 2, 6, 10],
[ 3, 7, 11]])
创建一个 ndarray 只需调用 NumPy 的 array 函数即可(要和array.array区分开哟)。
语法:numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
参数:
object:数组或嵌套的数列
dtype:数组元素的数据类型,可选
copy:对象是否需要复制,可选
order:创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)
subok:默认返回一个与基类类型一致的数组
ndmin:指定生成数组的最小维度
numpy.arange() 用来在给定间隔内返回均匀间隔的值,值在半开区间 [开始,停止]内生成(区间包括开始但不包括停止),返回的是 ndarray (数组)。
语法:numpy.arange(start, stop, step, dtype = None)
参数:
start : 开始位置,数字,可选项,默认起始值为0
stop: 停止位置,数字
step :步长,数字,可选项, 默认步长为1,如果指定了step,则还必须给出start。
dtype: 输出数组的类型。 如果未给出dtype,则从其他输入参数推断数据类型。
ndarray.shape 用来查看矩阵或者数组ndarray的维数。(注意这个使用时在shape后面没有括号哦)
语法:ndarray.shape
返回:括号内数组/元组的(行数,列数)元组(行数和列数的对应关系就是,创建的ndarray对象中有几个序列,就是几行,每个序列里面有几个元素就是有几列)
eg:
>>> a = array([[1,1],[1,2],[1,3],[1,4]]) #注意看行、列数对应关系
>>> a.shape
(4, 2)
语法:ndarray.shape[0] (注意哦,这是真的[0] 哦,是参数哦,不是误打上去的哦,下面的[1]也是)
返回:行数(如果输入的参数是实数也就不存在任何维度,会返回一个空元组)
语法:ndarray.shape[1]
返回:列数(如果输入的参数是实数也就不存在任何维度,会返回一个空元组)
ndarray.transpose用来实现矩阵转置。
语法:ndarray.transpose(转换参数)
具体用法eg:
arr1 = array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
arr2 = arr1.transpose((1,0,2))
输出:
array([[[ 0, 1, 2, 3],
[ 8, 9, 10, 11]],
[[ 4, 5, 6, 7],
[12, 13, 14, 15]]])
在这个例子中,可以看到ndarray对象顺序被ndarray.transpose()转换,那么转换的原则是什么呢?
arr1.shape 是(2, 2, 4) ,也就是arr1是一个 2维,2*4矩阵。
arr1.transpose(*args) 里面的参数,是用来调换arr1.shape返回的元组内元素的顺序,假设给arr1.shape标了角标,(2[0], 2[1], 4[2]), [ ] 里是shape返回的元组内元素的索引,transpose((1, 0, 2)) 的意思是按照这个角标顺序重新设置shape ,也就是 (2[1], 2[0], 4[2])
虽然看起来变换前后的shape都是( 2,2,4),但是transpose是转置,所以shape按照(1,0,2)的顺序重新设置了, array里的所有元素也要按照这个规则重新组成新矩阵。比如 8 在arr1中的索引是 (1, 0, 0) 那么按照刚才的变换规则,就是 (0, 1, 0) ,后面的依此类推。
当transpose()内没有传入参数时,默认转换行列。
除了上面说的Numpy和SciPy,还有Matplotlib,Matplotlib 是 Python 编程语言及其数值数学扩展包 NumPy 的可视化操作界面。它为利用通用的图形用户界面工具包,如 Tkinter, wxPython, Qt 或 GTK+ 向应用程序嵌入式绘图提供了应用程序接口(API)。
eg:
>>> import numpy
>>> floats = numpy.loadtxt('floats-10M-lines.txt') #从文本文件里读取 1000 万个浮点数,注意这里是txt文件。
>>> floats[-3:] #利用序列切片来读取其中的最后 3 个数。
array([ 3016362.69195522, 535281.10514262, 4566560.44373946])
>>> floats *= .5 #把数组里的每个数都乘以 0.5,然后再看看最后 3 个数,这里竟然可以忽略0!真是一个偷懒小技巧。
>>> floats[-3:]
array([ 1508181.34597761, 267640.55257131, 2283280.22186973])
>>> from time import perf_counter as pc #导入精度和性能都比较高的计时器(Python 3.3 及更新的版本中都有这个库)。
>>> t0 = pc(); floats /= 3; pc() - t0 #把每个元素都除以 3,可以看到处理 1000 万个浮点数所需的时间还不足 40 毫秒。
0.03690556302899495
>>> numpy.save('floats-10M', floats) #把数组存入后缀为 .npy 的二进制文件。
>>> floats2 = numpy.load('floats-10M.npy', 'r+') #将上面的数据导入到另外一个数组里,这次 load 方法利用了一种叫作内存映射的机制,它让我们在内存不足的情况下仍然可以对数组做切片。
>>> floats2 *= 6
>>> floats2[-3:] #把数组里每个数乘以 6 之后,再检视一下数组的最后 3 个数。
memmap([3016362.69195522, 535281.10514262, 4566560.44373946])
numpy.loadtxt用来获取文件。
语法:
numpy.loadtxt(fname, dtype=, comments=’#’, delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0)
参数:
fname:要读取的文件名称(文件的相对地址或者绝对地址)
dtype:读取后输出时的数据类型
comments:跳过文件中指定参数开头的行(即不读取),比如,如果某行开头是#,那么就跳过该行
delimiter:指定读取文件中数据的分割符。该参数类似于split()函数对数据根据参数进行分割处理。
converters:该参数是将某一列的数据进行函数预处理再获取,使用时的格式为:{列号:函数},可以看成一个字典形式,对列上的所有数据进行函数处理
skiprows:指定读取时忽略的行数,默认从首行开始计数,也就是说,设置skiprows=n时,前n行就会被跳过不读取。
usecols:该参数指定我们需要使用的列,设置usecols=n,用于提取文件中我们需要的数据列n。
unpack:选择是否将数据向量输出,默认是False,即将数据逐行输出,当设置为True时,数据将逐列输出。
ndmin:指定结果数组应具有的最小维数。根据需要,将根据需要预先设置形状。
perf_counter()是第三方库time的函数,该函数返回当前的计算机系统时间,只有连续两次perf_counter()并进行差值才能有意义,一般用于计算程序运行时间,返回性能计数器的值(以小数秒为单位)作为浮点数,即具有最高可用分辨率的时钟,是CPU级别时间,更为精确,适合测量短持续时间,所测得的时间结果包含睡眠期间所用的时间。通常perf_counter()用在测试代码时间上。在使用时直接调用即可。
在这个例子中两次分在程序进行的前后直接进行了调用,然后做了减法计算时间。
它的作用是保存一个数组到一个二进制的文件中,保存格式是.npy。
语法:numpy.save(file, arr, allow_pickle=True, fix_imports=True)
参数:
file:文件名/文件路径
arr:要存储的数组
allow_pickle:布尔值,允许使用Python pickles保存对象数组(可选参数,默认即可)
fix_imports:为了方便Pyhton2中读取Python3保存的数据(可选参数,默认即可)
NumPy 和 SciPy 都是异常强大的库,也是其他一些很有用的工具的基石。Pandas(http://pandas.pydata.org)和 Blaze(http://blaze.pydata.org)数据分析库就以它们为基础,提供了高效的且能存储非数值类数据的数组类型,和读写常见数据文件格式(例如 csv、xls、SQL 转储和 HDF5)的功能,后续在进行更深入学习。
今天的分享就到这里啦~有什么问题欢迎大家指出,我一定会及时修改 ~ ~ ~