内容
主要介绍了NumPy库中的函数。
组成方式
用非常零散的知识点串联成章节。
内容摘要
极简地展示了章节中所运用的函数。
第一章
arrange函数创建NumPy数组。
第二章
NumPy特性
- 在NumPy中,复数的虚部是用j表示的。
- 如果数组中包含复数元素,则其数据类型自动变为复数型。
自定义数据类型
dtype函数。
切片
ndarray支持在多维数组上的切片操作,ndarray对象的维度属性存储在元组中。
创建数组
- arange函数创建一个数组。
- insert函数构建完整的数组。
创建多维数组
- reshape函数的作用是改变数组的“形状”,也就是改变数组的维度。
- resize和reshape函数的功能一样,但resize会直接修改所操作的数组。
数组展平
- ravel函数完成数组展平的操作。
- flatten就是展平的意思,与ravel函数的功能相同。
- 不过,flatten函数会请求分配内存来保存结果,而ravel函数只是返回数组的一个视图(view)。
转置矩阵
transpose函数。
数组组合
concatenate函数可以实现水平组合、垂直组合。
水平组合
hstack函数。
垂直组合
vstack函数。
深度组合
dstack函数。
列组合
column_stack函数对于一维数组将按列方向进行组合。
行组合
row_stack函数对于两个一维数组,将直接层叠起来组合成一个二维数组。对于二维数组,row_stack与vstack的效果是相同的。
分割数组
split函数可以实现水平分割、垂直分割。
水平分割
hsplit函数。
垂直分割
vsplit函数。
深度分割
dsplit函数。
数组属性
shape属性
shape函数是numpy.core.fromnumeric中的函数,它的功能是读取矩阵的长度。
dtype 类的属性
- type属性对应于数组元素的数据类型。
- str属性可以给出数据类型的字符串表示。
- itemsize属性数据类型对象可以给出单个数组元素在内存中占用的字节数。
ndim属性
ndim属性,给出数组的维数,或数组轴的个数。
size属性
size属性,给出数组元素的总个数。
nbytes属性
nbytes属性,整个数组所占的存储空间,这个属性的值其实就是itemsize和size属性值的乘积。
T属性
T属性的效果和transpose函数一样(transpose()函数的作用就是调换数组的行列值的索引值,类似于求矩阵的转置。),对于一维数组,其T属性就是原数组。
real属性
real属性,给出复数数组的实部。如果数组中只包含实数元素,则其real属性将输出原 数组。
imag属性
imag属性,给出复数数组的虚部。
flat属性
- flat属性将返回一个numpy.flatiter对象,这是获得flatiter对象的唯一方式——我们无法访问flatiter的构造函数。这个所谓的“扁平迭代器”可以让我们像遍历一维数 组一样去遍历任意的多维数组。
- flat属性是一个可赋值的属性。对flat属性赋值将导致整个数组的元素都被覆盖。
- 可以用flatiter对象直接获取一个数组元素或者获取多个元素。
第三章
介绍方式
运用比较简单的数学知识来讲解股票相关知识,借此引出NumPy库中的函数。
统计函数
- 首先,我们使用min和max函数来确定股价的范围;然后,用median函数获取数据的中位数;最后,用std和var函数计算数据的标准差和方差。
- diff函数可以返回数组中相邻元素的差值,因此我们用它来计算股票的简单收益率。
- log函数可以计算数组元素的自然对数。
- loadtxt函数默认将所有数据转换为浮点数类型,它有一个特定的参数可以完成转换。这个参数就是converters,它是一个可以将数据列和所谓的转换函数连接起来的参数。
- ones函数可以创建一个全为1的数组
- convolve函数可以根据指定的权重计算卷积。
- exp和linspace函数得到了一组指数衰减的权重值。
- linspace可以给出一个均匀分布的数组,然后我们计算出该数组元素的指数。
- ndarray类的sum方法对权重值做归一化处理。
- fill函数可以用一个指定的标量值填充数组,而这个标量值也是其唯一的参数。
- Matplotlib函数绘制图像。
- average函数可以返回数组元素的加权平均值。
第四章
- cov函数计算股票收益率的协方差矩阵。
- diagonal函数查看对角线上的元素。
- trace函数计算矩阵的迹,即对角线上元素之和。
- ployfit函数可以用多项式去拟合一系列数据点,无论这些数据点是否来自连续函数都适用。
- roots函数找出我们拟合的多项式函数什么时候到达0值。
- diff函数可以计算数组中两个连续元素的差值,并返回一个由这些差值组成的数组。
- astype函数可以在转换数组时指定数据类型。
- sign函数可以返回数组中每个元素的正负符号,数组元素为负时返回-1,为正时返回1,否则返回0。
- piecewise函数来获取数组元素的正负,可以分段给定取值,使用合适的返回值和对应的条件调用该函数。
- vectorize函数相当于Python中的map函数。
- hanning函数是一个加权余弦的窗函数,平滑数据。
- convolve函数是numpy函数中的卷积函数库。
- polysub函数对多项式作差。
- isreal函数来判断数组元素是否为实数。
- select函数可以根据一组给定的条件,从一组元素中挑选出符合条件的元素并返回数组。
- trim_zeros函数可以去掉一维数组中开头和末尾为0的元素。
- corrcoef函数计算两只股票收益率的相关性。
- polyval函数计算多项式函数的取值。
- polyder函数求解多项式函数的导函数。
相关系数
计算向量a和b的相关系数。
相关股票知识
- 判断两只股票的价格走势是否同步。如果它们的差值偏离了平均差值2倍于标准差的距离,则认为这两只股票走势不同步。
- 成交量(volume)是投资中一个非常重要的变量,它可以表示价格波动的大小。 OBV(On-Balance Volume,净额成交量或叫能量潮指标)是最简单的股价指标之一,它可以由当日收盘价、前一天的收盘价以及当日成交量计算得出。
第五章
通用函数
- mat、matrix以及bmat函数来创建矩阵。
- mat函数创建了矩阵,用T属性获取了转置矩阵,用I属性获取了逆矩阵。
- bmat函数即分块矩阵(block matrix)。
- 分号 “;”是矩阵的行分隔符。
- frompyfunc创建通用函数。
- zeros_like函数根据输入参数的形状初始化一个全为0的数组。
基本算术运算符+、-和*隐式关联着通用函数add、subtract和multiply。
add函数,其对数组的reduce计算结果等价于对数组元素求和。
accumulate方法同样可以递归作用于输入数组,它将存储运算的中间结果并返回。
outer方法返回一个数组,它的秩(rank)等于两个输入数组的秩的和。它会作用于两个输入数组之间存在的所有元素对。
数组的除法运算中涉及三个通用函数divide、true_divide和floor_division,以及两个对应的运算符/和//。
divide函数在整数和浮点数除法中均只保留整数部分。(使用/运算符相当于调用divide函数。)
true_divide函数与数学中的除法定义更为接近,即返回除法的浮点数结果而不作截断。
floor_divide函数总是返回整数结果( 运算符//对应于floor_divide函数。),相当于先调用divide函数再调用floor函数。(floor函数将对浮点数进行向下取整并返回整数。)
计算模数或者余数,可以使用NumPy中的mod、remainder和fmod函数。当然,也可以使
用%运算符。
remainder函数逐个返回两个数组中元素相除后的余数。如果第二个数字为0,则直接返回0。
mod函数与remainder函数的功能完全一致。
%操作符仅仅是remainder函数的简写。
fmod函数处理负数的方式与remainder、mod和%不同,所得余数的正负由被除数决定,与除数的正负无关。
- matrix函数创建矩阵。
- rint函数对浮点数取整,但结果仍为浮点数类型。
操作符
- XOR操作符又被称为不等运算符,因此当两个操作数的符号不一致时,XOR操作的结果为负数。
- ^操作符对应于bitwise_xor函数。
- <操作符对应于less函数。
- &操作符对应于bitwise_and函数。
- ==操作符对应于equal函数。
- <<操作符对应于left_shift函数。
数学知识
- 斐波那契数列的递推关系可以用矩阵来表示。斐波那契数列的计算等价于矩阵的连乘。
- 方波也是一种可以在示波器上显示的波形。方波可以近似表示为多个正弦波的叠加。事实上,任意一个方波信号都可以用无穷傅里叶级数来表示。
傅里叶级数(Fourier series)是以正弦函数和余弦函数为基函数的无穷级数。
锯齿波的无穷级数表达式如下:
第六章
- dot函数,用于计算两个浮点数数组的点积。
- diag函数生成完整的奇异值矩阵。
linalg模块
线性代数
奇异矩阵即行列式等于0的矩阵。
特征值(eigenvalue)即方程 Ax = ax 的根,是一个标量。其中,A 是一个二维矩阵,x 是一个一维向量。特征向量(eigenvector)是关于特征值的向量。
SVD(Singular Value Decomposition,奇异值分解)是一种因子分解运算,将一个矩阵分解为3个矩阵的乘积。奇异值分解是前面讨论过的特征值分解的一种推广。
对于一个n×n的实数矩阵,行列式描述的是一个线性变换对“有向体积”所造成的影响。行列式的值为正表示保持了空间的定向(顺时针或逆时针),为负则表示颠倒了空间的定向。
- numpy.linalg模块包含线性代数的函数。使用这个模块,计算逆矩阵、求特征值、解线性方程组以及求解行列式等。
- numpy.linalg模块中的inv函数可以计算逆矩阵。(inv函数只接受方阵作为输入矩阵。)
- numpy.linalg中的函数solve可以求解形如 Ax = b 的线性方程组,其中 A 为矩阵,b 为一维或二维的数组,x是未知变量。
- 在numpy.linalg模块中,eigvals函数可以计算矩阵的特征值,而eig函数可以返回一个包含特征值和对应的特征向量的元组。
在numpy.linalg模块中的svd函数可以对矩阵进行奇异值分解。该函数返回3个矩阵——U、Sigma和V,其中U和V是正交矩阵,Sigma包含输入矩阵的奇异值。
- 摩尔·彭罗斯广义逆矩阵(Moore-Penrose pseudoinverse)可以使用numpy.linalg模块中的pinv函数进行求解。计算广义逆矩阵需要用到奇异值分解。
- numpy.linalg模块中的det函数可以计算矩阵的行列式。
- numpy.linalg模块中的fftshift函数可以将FFT输出中的直流分量移动到频谱的中央。
fft模块
- FFT(Fast Fourier Transform,快速傅里叶变换)是一种高效的计算DFT(Discrete Fourier Transform,离散傅里叶变换)的算法。FFT算法比根据定义直接计算更快,计算复杂度为O(NlogN)。DFT在信号处理、图像处理、求解偏微分方程等方面都有应用。
- 在NumPy中,有一个名为fft的模块提供了快速傅里叶变换的功能。在这个模块中,许多函数都是成对存在的,也就是说许多函数存在对应的逆操作函数。fft和ifft函数是其中的一对。
- ifft函数,可以近似地还原初始信号。
- ifftshift函数还原移频操作前的信号。
random模块
随机数
- NumPy random模块中的binomial函数模拟了随机游走。
- 使用NumPy random模块中的normal函数产生指定数量的随机数。
- NumPy的linspace函数生成一组均匀分布的数值。
超几何分布
超几何分布(hypergeometric distribution)是一种离散概率分布,它描述的是一个罐子里有两种物件,无放回地从中抽取指定数量的物件后,抽出指定种类物件的数量。
NumPy random模块中的hypergeometric函数可以模拟超几何分布。
连续分布
- 连续分布可以用PDF(Probability Density Function,概率密度函数)来描述。随机变量落在某一区间内的概率等于概率密度函数在该区间的曲线下方的面积。
- NumPy的random模块中有一系列连续分布的函数——beta、chisquare、exponential、f、gamma、gumbel、laplace、lognormal、logistic、multivariate_normal、noncentral_chisquare、noncentral_f、normal等。
正态分布
绘制正态分布
概率密度函数曲线(均值为0、方差为1的正态分布)。
使用Matplotlib进行绘图。
dummy, bins, dummy = plt.hist(normal_values, np.sqrt(N), normed=True, lw=1)
sigma = 1
mu = 0
plt.plot(bins, 1/(sigma * np.sqrt(2 * np.pi)) * np.exp( - (bins -mu)**2 / (2 * sigma**2) ),lw=2)
plt.show()
对数正态分布
对数正态分布(lognormal distribution) 是自然对数服从正态分布的任意随机变量的概率分布。
NumPy random模块中的lognormal函数模拟对数正态分布。
绘制对数正态分布
使用Matplotlib进行绘图。
dummy, bins, dummy = plt.hist(lognormal_values,np.sqrt(N), normed=True, lw=1)
sigma = 1
mu = 0
x = np.linspace(min(bins), max(bins), len(bins))
pdf = np.exp(-(numpy.log(x) - mu)**2 / (2 * sigma**2))/ (x *sigma * np.sqrt(2 * np.pi))
plt.plot(x, pdf,lw=3)
plt.show()
第七章
介绍方式
用贷款、利率来介绍相关函数。
排序函数
- sort函数返回排序后的数组。
- ndarray类的sort方法可对数组进行原地排序。
- lexsort函数根据键值的字典序进行排序,返回输入数组按字典序排序后的下标。
- argsort函数返回输入数组排序后的下标。
- msort函数沿着第一个轴排序。
- sort_complex函数对复数按照先实部后虚部的顺序进行排序。
设置随机数种子
seed函数设置随机数种子。
搜索函数
- argmax函数返回数组中最大值对应的下标。
- nanargmax函数返回数组中最大值对应的下标,但忽略NaN值。
- argmin函数返回数组中最小值对应的下标,但忽略NaN值。
- argwhere函数根据条件搜索非零的元素,并分组返回对应的下标。
- searchsorted函数可以为指定的插入值寻找维持数组排序的索引位置,为指定的插入值返回一个在有序数组中的索引位置,从这个位置插入可以保持数组的有序性。该函数使用二分搜索算法,计算复杂度为O(log(n))。
- extract函数返回满足指定条件的数组元素,可以根据某个条件从数组中抽取元素,与where函数相似。
- nonzero函数专门用来抽取非零的数组元素。
金融函数
- fv函数计算所谓的终值(future value)(终值决定于4个参数——利率、期数、每期支付金额以及现值。),即基于一些假设给出的某个金融资产在未来某一时间点的价值。
- pv函数计算现值(present value),即金融资产当前的价值。该函数和fv函数是镜像对称的,同样需要利率、期数、每期支付金额这些参数,不过这里输入为终值,输出为现值。
- npv函数返回的是净现值(net present value),即按折现率计算的净现金流之和。该函数需要两个参数,即利率和一个表示现金流的数组。
- pmt函数根据本金、利率和期数计算每期需支付的金额。
- irr函数计算内部收益率(internal rate of return)(内部收益率是是净现值为0时的有效利率,不考虑通胀因素。),根据给定的现金流数据返回对应的内部收益率。
- mirr函数计算修正后内部收益率(modified internal rate of return),是内部收益率的改进版本。
- nper函数计算定期付款的期数,所需的参数为贷款利率、固定的月供以及贷款额。
- rate函数计算利率(rate of interest)根据给定的付款期数、每期付款资金、现值和终值计算利率。
窗函数
- 窗函数(window function)是信号处理领域常用的数学函数,相关应用包括谱分析和滤波器设计等。
- NumPy中有很多窗函数,如bartlett、blackman、hamming、hanning和kaiser。这些窗函数除在给定区间之外取值均为0。
巴特利特窗
- 巴特利特窗(Bartlett window)是一种三角形平滑窗。
- bartlett函数计算巴特利特窗。
布莱克曼窗
- 布莱克曼窗(Blackman window)形式上为三项余弦值的加和。
- NumPy中的blackman函数返回布莱克曼窗。该函数唯一的参数为输出点的数量。如果数量为0或小于0,则返回一个空数组。
- 由于存在很强的边界效应,使用时省略最前面和最后面部分数据点。
汉明窗
- 汉明窗(Hamming window)形式上是一个加权的余弦函数。
- NumPy中的hamming函数返回汉明窗。该函数唯一的参数为输出点的数量。如果数量为0或小于0,则返回一个空数组。
凯泽窗
- 凯泽窗(Kaiser window)是以贝塞尔函数(Bessel function)定义的。
- 这里的I0即为零阶的贝塞尔函数。
- NumPy中的kaiser函数返回凯泽窗。该函数的第一个参数为输出点的数量。如果数量为0或小于0,则返回一个空数组。第二个参数为β值。
贝塞尔函数
- 贝塞尔函数(Bessel function)是贝塞尔微分方程的标准解函数。
- 在NumPy中,以i0 表示第一类修正的零阶贝塞尔函数。
- sinc函数(sinc是一个三角函数,在数学和信号处理领域被广泛应用。)在NumPy中有同名函数sinc。该函数也有一个二维版本,sinc2d函数需要输入一个二维数组,可以用outer函数生成二维数组。
第八章
单元测试
- 单元测试是由程序员编写的自动测试模块,用来测试代码。这些单元测试可以测试某个函数或函数中的某个独立的部分。每一个单元测试仅仅对一小部分代码进行测试。单元测试可以带来诸多好处,如提高代码质量、可重复性测试等,使软件副作用更为清晰。
- TDD(Test Driven Development,测试驱动的开发)是软件开发史上最重要的里程碑之一。TDD主要专注于自动单元测试,它的目标是尽最大限度自动化测试代码。如果代码被改动,我们仍可以运行测试并捕捉可能存在的问题。换言之,测试对于已经存在的功能模块依然有效。
nose 和测试装饰器
nose
nose同时也是一种Python框架,使得(单元)测试更加容易。根据nose的文档,任何能够匹配testMatch正则表达式(默认为(?:^|[b_.-])[Tt]est)的Python源代码文件、文件夹或库都将被收集用于测试。nose充分利用了装饰器(decorator)。Python装饰器是有一定含义的对函数或方法的注解。numpy.testing模块中有很多装饰器。
装饰器
- numpy.testing.decorators.deprecated 在运行测试时过滤掉过期警告。
- numpy.testing.decorators.knownfailureif 根据条件抛出KnownFailureTest异常。
- numpy.testing.decorators.setastest 将函数标记为测试函数或非测试函数。
- numpy.testing.decorators. skipif 根据条件抛出SkipTest异常,跳过测试。
- numpy.testing.decorators.slow 将测试函数标记为“运行缓慢”。
decorate_methods函数,将装饰器应用到能够匹配正则表达式或
字符串的类方法上。
断言函数
抛出异常
- assert_almost_equal 如果两个数字的近似程度没有达到指定精度,就抛出异常。
- assert_approx_equal 如果两个数字的近似程度没有达到指定有效数字,就抛出异常。
- assert_array_almost_equal 如果两个数组中元素的近似程度没有达到指定精度,就抛出异常。
assert_almost_equal函数的参数decimal,用来指定小数点后的精度。
- assert_array_equal 如果两个数组对象不相同,就抛出异常,两个数组相等必须形状一致且元素也严格相等,允许数组中存在NaN元素。
- assert_array_less 两个数组必须形状一致,并且第一个数组的元素严格小于第二个数组的元素,否则就抛出异常。
- assert_equal 如果两个对象不相同,就抛出异常。
- assert_raises 若用填写的参数调用函数没有抛出指定的异常,则测试不通过。
- assert_warns 若没有抛出指定的警告,则测试不通过。
- assert_string_equal 断言两个字符串变量完全相同,如果测试不通过,将会抛出异常并显示两个字符串之间的差异,该函数区分字符大小写。
- assert_allclose 如果两个对象的近似程度超出了指定的容差限,就抛出异常。比较数组也可以使用assert_allclose函数。该函数有参数atol(absolute tolerance,绝对容差限)和rtol(relative tolerance,相对容差限)。对于两个数组a和b,将测试是否满足以下等式:|a - b| <= (atol + rtol *|b|)。
浮点数比较
- 浮点数在计算机中是以不精确的方式表示的。
NumPy中的assert_array_almost_equal_nulp和assert_array_max_ulp函数可以提供可靠的浮点数比较功能。
- ULP是Unit of Least Precision的缩写,即浮点数的最小精度单位。根据IEEE 754标准,四则运算的误差必须保持在半个ULP之内。
- 机器精度(machine epsilon)是指浮点运算中的相对舍入误差上界。机器精度等于ULP相对于1的值。
NumPy中的finfo函数可以获取机器精度。
多 ULP 的浮点数比较
assert_array_max_ulp函数可以指定ULP的数量作为允许的误差上界。参数maxulp接受整数作为ULP数量的上限,默认值为1。
文档字符串
- 文档字符串(docstring)是内嵌在Python代码中的类似交互式会话的字符串。这些字符串可以用于某些测试,也可以仅用于提供使用示例。
- numpy.testing模块中有一个函数可以运行这些测试。
第九章
Matplotlib是一个非常有用的Python绘图库。它和NumPy结合得很好,但
本身是一个单独的开源项目。
简单绘图
- matplotlib.pyplot包中包含了简单绘图功能。需要记住的是,随后调用的函数都会改变当前的绘图。最终,我们会将绘图存入文件或使用show函数显示出来。
- 运行在Qt或Wx后端的IPython,图形将会交互式地更新,而不需要等待show函数的结果。
绘制多项式函数及其导函数
- 使用poly1d函数创建多项式。
- derive函数,参数m的数值为其m阶导函数。
- 使用NumPy的linspace函数创建x轴的数值。
- plot函数,并不会立刻显示函数图像,可以接受任意个数的参数,可以使用
可选的格式字符串参数指定线条的颜色和风格,默认为b-即蓝色实线。
- xlabel函数添加x轴标签。
- ylabel函数添加y轴标签。
- show函数显示函数图像。
子图
- 分组绘制多曲线。
- subplot函数可创建子图。该函数的第一个参数是子图的行数,第二个参数是子图的列数,第三个参数是一个从1开始的序号。另一种方式是将这3个参数结合成一个数字,如311。这样,子图将被组织成3行1列。
- title函数设置子图的标题。
K线图
- matplotlib.finance包中的函数可以从网站中下载数据。
- 定位器(locator)可定位月份和日期。主定位器:set_major_locator,次定位器:set_minor_locator。
- 日期格式化器(date formatter)以格式化x轴上的日期。
- 创建一个Matplotlib的figure对象——这是绘图组件的顶层容器。
- matplotlib.finance包中candlestick函数可以绘制K线图。
- autofmt_xdate函数将x轴上的标签格式化为日期。为了更好地适应x轴的长度,标签将被旋转。
直方图
- 直方图(histogram)可以将数据的分布可视化。
- Matplotlib中有便捷的hist函数可以绘制直方图。该函数的参数中有这样两项——包含数据的数组以及柱形的数量。
对数坐标图
- 当数据的变化范围很大时,对数坐标图(logarithmic plot)很有用。
- Matplotlib中有semilogx函数(对x轴取对数)、semilogy函数(对y轴取对数)和loglog函数(同时对x轴和y轴取对数)。
绘制股票成交量
股票成交量变化很大,因此我们需要对其取对数后再绘制。
散点图
- 散点图(scatter plot)用于绘制同一数据集中的两种数值变量。
- Matplotlib的scatter函数可以创建散点图,可以指定数据点的颜色和大小,以及图像的alpha透明度。
- grid函数添加网格线。
着色
fill_between函数使用指定的颜色填充图像中的区域,可以选择alpha通道的取值,该函数的where参数可以指定着色的条件。
图例和注释
- 对于高质量的绘图,图例和注释是至关重要的。
- legend函数创建透明的图例,并由Matplotlib自动确定其摆放位置。
- set_alpha函数设置alpha通道值,将图例透明化。
- annotate函数在图像上精确地添加注释,并有很多可选的注释和箭头风格。
三维绘图
- 对于3D作图,我们需要一个和三维投影相关的Axes3D对象。
- meshgrid函数创建一个二维的坐标网格。这将用于变量x和y的赋值。
- plot_surface函数指定行和列的步幅,以及绘制曲面所用的色彩表(color map)。步幅决定曲面上“瓦片”的大小,而色彩表的选择取决于个人喜好。
等高线图
- Matplotlib中的等高线3D绘图有两种风格——填充的和非填充的。
- contour函数创建一般的等高线图。
- contourf函数绘制对于色彩填充的等高线图。
动画
- Matplotlib提供酷炫的动画功能。Matplotlib中有专门的动画模块。
- 定义一个回调函数,用于定期更新屏幕上的内容。
- 需要一个函数来生成图中的数据点。
第十章
SciPy是世界著名的Python开源科学计算库,建立在NumPy之上。它增加的功能包括数值积分、最优化、统计和一些专用函数。
文件输入/输出
- MATLAB以及其开源替代品Octave都是流行的数学工具。
- scipy.io包的函数可以在Python 中加载或保存MATLAB和Octave的矩阵和数组。
- loadmat函数可以加载.mat文件。
- savemat函数可以将数组和指定的变量名字典保存为.mat文件,该函数有两个参数,一个文件名和一个包含变量名和取值的字典。
统计
- SciPy的统计模块是scipy.stats,其中有一个类是连续分布的实现,一个类是离散分布的实现。此外,该模块中还有很多用于统计检验的函数。
- 偏度(skewness)描述的是概率分布的偏斜(非对称)程度。
stats.skewtest函数有两个返回值,其中第二个返回值为p-value,即观察到的数据集服从正态分布的概率,取值范围为0~1。
- 峰度(kurtosis)描述的是概率分布曲线的陡峭程度。
stats.kurtosistest函数返回峰度检验。
- 正态性检验(normality test)可以检查数据集服从正态分布的程度。
stats.normaltest函数返回正态性检验。
- stats.scoreatpercentile函数得到数据所在的区段中某一百分比处的数值。
- stats.percentileofscore函数得到从某数值出发找到对应的百分比。
样本比对和 SciKits
- 统计检验是scikits.statsmodels.stattools中的Jarque-Bera正态性检验。
- SciKits是Python的小型实验工具包,它并不是SciPy的一部分。
- pandas(Python Data Analysis Library),它是scikits.statsmodels的分支。
- stats.ttest_ind函数可以实现均值检验,可以检查两组不同的样本是否有相同的均值。
- ks_2samp函数可以实现Kolmogorov-Smirnov检验,可以判断两组样本同分布的可能性。
信号处理
- scipy.signal模块中包含滤波函数和B样条插值(B-spline interpolation)函数。
- 样条插值使用称为样条的多项式进行插值。插值过程将分段多项式连接起来拟合数据。B样条是样条的一种类型。
- SciPy中以一组数值来定义信号。
- detrend函数作为滤波器的一个例子。该函数可以对信号进行线性拟合,然后从原始输入数据中去除这个线性趋势。
傅里叶分析
- 现实世界中的信号往往具有周期性。傅里叶变换(Fourier transform)是处理这些信号的常用工具。
- 傅里叶变换是一种从时域到频域的变换,也就是将周期信号线性分解为不同频率的正弦和余弦函数。
- 傅里叶变换的函数可以在scipy.fftpack模块中找到(NumPy也有自己的傅里叶工具包,即numpy.fft)。这个模块包含快速傅里叶变换、微分算子和拟微分算子以及一些辅助函数。
- scipy.fftpack模块中的很多函数与MATLAB对应的函数同名,且功能也很相近。
- abs函数 应用傅里叶变换,得到信号的频谱。
数学优化
- 优化算法(optimization algorithm)尝试寻求某一问题的最优解,例如找到函数的最大值或最小值,函数可以是线性或者非线性的。
- 解可能有一些特定的约束。
- 在scipy.optimize模块中提供了一些优化算法。
- 最小二乘法函数leastsq就是其中之一。当调用这个函数时,我们需要提供一个残差(误差项)函数。这样,leastsq将最小化残差的平方和。得到的解与我们使用的数学模型有关。我们还需要为算法提供一个起始点,这应该是一个最好的猜测——尽可能接近真实解。否则,程序执行800轮迭代后将停止。
数值积分
- SciPy中有数值积分的包scipy.integrate,在NumPy中没有相同功能的包。
- quad函数可以求单变量函数在两点之间的积分,这些点之间的距离可以是无穷小或无穷大。该函数使用最简单的数值积分方法即梯形法则(trapezoid rule)进行计算。
高斯积分
- 高斯积分(Gaussian integral)出现在误差函数(数学中记为erf)的定义中,但高斯积分本身的积分区间是无穷的,它的值等于pi的平方根。
- quad函数可以计算高斯积分。
插值
- 插值(interpolation)即在数据集已知数据点之间“填补空白”。
- scipy.interpolate函数可以根据实验数据进行插值。interp1d类可以创建线性插值(linear interpolation)或三次插值(cubic interpolation)的函数。默认将创建线性插值函数,三次插值函数可以通过设置kind参数来创建。
interp2d类的工作方式相同,只不过用于二维插值。
- sinc函数创建数据点。
图像处理
- scipy.ndimage包进行图像处理。该模块包含各种图像滤波器和工具函数。
- ndimage.median_filter函数是中值滤波器,扫描信号的每一个数据点,并替换为相邻数据点的中值。
- ndimage.rotate函数旋转图像。
- ndimage.prewitt滤波器是基于图像强度的梯度计算。
音频处理
- scipy.io.wavfile模块中的wavfile.read函数可以将WAV文件转换为一个NumPy数组。
- scipy.io.wavfile模块中的wavfile.write函数写入一个新的WAV文件。
- np.tile函数可以重复播放音频片段。
第十一章
Pygame基础
- Pygame最初是由Pete Shinners编写的一套Python架构。
- Pygame基于SDL(Simple DirectMedia Layer,简易直控媒体层)。
- SDL是一套C语言架构,可用于在各种操作系统中(包括Linux、Mac OS X和Windows)访问图形、声音、键盘以及其他输入设备。
- pygame.init() 该函数用于初始化,需要在调用其他Pygame函数前被调用。
- pygame.display.set_mode((400, 300)) 该函数创建所谓的Surface对象用于绘图。我们为该函数提供一个元组来表示对象的大小。
- pygame.display.set_caption(‘Hello World!’) 该函数可将窗口标题设置为指定的字符串。
- pygame.font.SysFont(“None”, 19) 该函数根据英文逗号隔开的系统字体列表字符串(在本例中为None)和字体大小创建字体对象。
- sysFont.render(‘Hello World’, 0, (255, 100, 100)) 该函数在Surface对象上呈现文本。最后一个参数是一个元组,即以RGB值表示的颜色。
- screen.blit(rendered, (100, 100)) 该函数在Surface对象上进行绘制。
- pygame.event.get() 该函数用于获取Event对象列表。Event对象表示系统中的 一些特殊事件,如用户退出游戏。
- pygame.quit() 该函数清理Pygame使用的资源。在退出游戏前调用此函数。
- pygame.display.update() 该函数刷新屏幕上显示的内容。
Matplotlib集成
- 为了在Pygame中集成Matplotlib,我们需要使用一个非交互式的后台,否则Matplotlib会默认显示一个GUI窗口。
- Matplotlib主模块并调用use函数。该函数必须在引入Matplotlib主模块后并引入其他Matplotlib模块前立即调用。
- mpl.use(“Agg”) 该函数指定使用非交互式后端。
- plt.figure(figsize=[3, 3]) 该函数创建一个大小为3 × 3平方英寸的图像。
- agg.FigureCanvasAgg(fig) 该函数在非交互模式下创建一个画布。
- canvas.draw() 该函数在画布上进行绘制。
- canvas.get_renderer() 该函数获取画布的渲染器。
屏幕像素
- Pygame的surfarray模块可以处理PygameSurface对象和NumPy数组之间的转换。
- shape属性获取像素数组的形状,并据此创建界面。
- tile函数可以轻松平铺图片,由于颜色是定义为整数的,像素数据需要被转换成整数。
- pygame.surfarray.array2d(img) 该函数将像素数据存入一个二维数组
- pygame.surfarray.blit_array(screen, new_pixels) 该函数将数组中的像素呈现在屏幕上。
NumPy特性
NumPy可以快速、高效地处理大规模数组。
人工智能
scikit-learn项目旨在提供机器学习的API,其文档出色。
数据点聚类
- 聚类是一种机器学习算法,即依据相似度对数据点进行分组。
- 关联矩阵即包含关联值的矩阵,如点与点之间的距离。
- AffinityPropagation类将为每一个数据点标记合适的聚类编号。
- sklearn.cluster.AffinityPropagation().fit(S) 该函数创建AffinityPropagation对象并根据关联矩阵进行聚类。
- pygame.draw.polygon(screen, (255, 0,0), polygon points[i]) 该函数根据指定的Surface对象、颜色(在本例中为红色)和数据点列表绘制多边形。
动画
- 动画只是不同的时间在不同地点显示对象,从而模拟对象的移动。
- pygame.time.Clock() 该函数创建一个游戏中的时钟对象。
- clock.tick(30) 该函数设置时钟周期。这里的30即每秒钟的帧数。
- np.concatenate函数可以将四个方向的路径可以连接在一起,但需要先用T操作符对数组进行转置操作,使得它们以正确的方式对齐。
OpenGL
- OpenGL是专业的用于二维和三维图形的计算机图形应用程序接口(API)。
- 谢尔宾斯基地毯(Sierpinski gasket),亦称作谢尔宾斯基三角形(Sierpinski
triangle)或谢尔宾斯基筛子(Sierpinski sieve)。
这是一种三角形形状的分形(fractal),由数学家瓦茨瓦夫·谢尔宾斯基(Waclaw Sierpinski)提出。
这个三角形是经过原则上无穷的递归过程得到的。
- pygame.display.set_mode((w,h), pygame.OPENGL|pygame.DOUBLEBUF) 该函数将显示模式设置为指定的宽度、高度和OpenGL对应的显示类型。
- glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
该函数使用掩码清空缓冲区。在本例中,我们清空的是颜色和深度缓冲区。
- glu0rtho2D(0, w, 0, h) 该函数根据上、下、左、右的裁切平面坐标定义一个2D的正交投影矩阵。
- glColor3f(1.0, 0, 0) 该函数根据三个浮点数表示的RGB颜色来设置当前的绘图颜色。在本例中为红色。
- glBegin(GL_P0INTS) 该函数限定一组或多组图元的定点定义。
- glVertex2fv(point) 该函数根据一个顶点产生一个点。
- glEnd() 该函数结束以glBegin开始的代码段。
- glFlush() 该函数强制刷新缓冲区,执行绘图命令。
- ndimage.convolve(arr, weights, mode=‘wrap’) 该函数在包络模式下对指定的数组进行卷积操作。该模式会处理数组的边界。
- bools.astype(int) 该函数将布尔数组转换为整数数组。
- np.arange(0, pos[0], 10) 该函数创建一个范围从0到pos[0],且元素间隔为10的数组。所以如果pos[0]为1000,我们将得到0, 10, 20, …, 990。