1、排序和搜索
NumPy提供了多种排序函数,如下所示:
sort函数返回排序后的数组;
lexsort函数根据键值的字典序进行排序;
argsort函数返回输入数组排序后的下标;
ndarray类的sort方法可对数组进行原地排序
msort函数沿着第一个轴排序;
sort_complex函数对复数按照先实部后虚部的顺序进行排序。
在上面的列表中,argsort和sort函数可用来对NumPy数组类型进行排序。
1.1对复数进行排序
复数包含实数部分和虚数部分。如同在前面的章节中提到的,NumPy中有专门的复数类型,使用两个浮点数来表示复数。这些复数可以使用NumPy的sort_complex函数进行排序。该函数按照先实部后虚部的顺序排序。
import numpy as np
import datetime
# (1) 生成5个随机数作为实部,5个随机数作为虚部。设置随机数种子为42
np.random.seed(42)
complex_numbers = np.random.random(5) + 1j * np.random.random(5)
print "Complex numbers\n", complex_numbers
# (2) 调用sort_complex函数对上面生成的复数进行排序
print "Sorted\n", np.sort_complex(complex_numbers)
1.2 搜索
import numpy as np
a=np.array([1,2,3,6,7])
# argmax函数返回数组中最大值对应的下标
print np.argmax(a)
#nanargmax函数提供相同的功能,但忽略NaN值
print np.nanargmax(a)
# argmin和nanargmin函数的功能类似,只不过换成了最小值。
#argwhere函数根据条件搜索非零的元素,并分组返回对应的下标
print np.where(a>3)
# searchsorted函数可以为指定的插入值寻找维持数组排序的索引位置。该函数使用二分搜索算法,计算复杂度为O(log(n))。我们随后将具体学习这个函数。
#extract函数返回满足指定条件的数组元素。
searchsorted函数
import numpy as np
# (1) 我们需要一个排序后的数组。使用arange函数创建一个升序排列的数组
a=np.arange(8)
# 调用searchsorted函数,索引即可以维持数组排序的插入位置
indices=np.searchsorted(a,[-2,7])
print 'Indice',indices
# (3) 使用insert函数构建完整的数组
print "The full array", np.insert(a, indices, [-2, 7])
2、特殊函数
数组元素抽取
NumPy的extract函数可以根据某个条件从数组中抽取元素。与where函数相似。nonzero函数专门用来抽取非零的数组元素。
import numpy as np
# (1) 使用arange函数创建数组
a = np.arange(7)
# (2) 生成选择偶数元素的条件变量
condition = (a % 2) == 0
# (3) 使用extract函数基于生成的条件从数组中抽取元素
print "Even numbers", np.extract(condition, a)
# (4) 使用nonzero函数抽取数组中的非零元素
print "Non zero", np.nonzero(a)
3、金融函数
NumPy中有很多金融函数,如下所示。
fv函数计算所谓的终值(future value),即基于一些假设给出的某个金融资产在未来某一
时间点的价值。
pv函数计算现值(present value),即金融资产当前的价值。
npv函数返回的是净现值(net present value),即按折现率计算的净现金流之和。
pmt函数根据本金和利率计算每期需支付的金额。
irr函数计算内部收益率(internal rate of return)。内部收益率是是净现值为0时的有效利
率,不考虑通胀因素。
mirr函数计算修正后内部收益率(modified internal rate of return),是内部收益率的改进
版本。
nper函数计算定期付款的期数。
rate函数计算利率(rate of interest)。
3.1、计算终值
终值是基于一些假设给出的某个金融资产在未来某一时间点的价值。终值决定于4个参数——利率、期数、每期支付金额以及现值。
import numpy as np
from matplotlib.pyplot import plot, show
print "Future value", np.fv(0.03/4, 5 * 4, -10, -1000)
fvals = []
for i in xrange(1, 10):
fvals.append(np.fv(.03/4, i * 4, -10, -1000))
plot(fvals, 'bo')
show()
3.2 现值
现值(present value)是指资产在当前时刻的价值。NumPy中的pv函数可以计算现值。该函数和fv函数是镜像对称的,同样需要利率、期数、每期支付金额这些参数,不过这里输入为终值,输出为现值。
import numpy as np
from matplotlib.pyplot import plot, show
print "Present value", np.pv(0.03/4, 5 * 4, -10, 1376.09633204)
3.3净现值
净现值(net present value)定义为按折现率计算的净现金流之和。NumPy中的npv函数返回净现值。该函数需要两个参数,即利率和一个表示现金流的数组。
import numpy as np
# (1) 生成5个随机数作为现金流的取值。插入-100作为初始值。
cashflows = np.random.randint(100, size=5)
cashflows = np.insert(cashflows, 0, -100)
print "Cashflows", cashflows
# (2) 根据上一步生成的现金流数据,调用npv函数计算净现值。利率按3%计算。
print "Net present value", np.npv(0.03, cashflows)
3.4 内部收益率
内部收益率(internal rate of return)是净现值为0时的有效利率,不考虑通胀因素。NumPy中的irr函数根据给定的现金流数据返回对应的内部收益率。
4、窗口函数
窗函数(window function)是信号处理领域常用的数学函数,相关应用包括谱分析和滤波器设计等。这些窗函数除在给定区间之外取值均为0。NumPy中有很多窗函数,如bartlett、blackman、
hamming、hanning和kaiser。
4.1绘制巴特利特窗
import numpy as np
from matplotlib.pyplot import plot, show
# (1) 调用NumPy中?的bartlett函数,以计算巴特利特窗。
window = np.bartlett(42)
# (2) 使用Matplotlib绘制巴特利特窗,非常简单。
plot(window)
show()
4.2使用布莱克曼窗
布莱克曼窗(Blackman window)形式上为三项余弦值的加和
NumPy中的blackman函数返回布莱克曼窗。该函数唯一的参数为输出点的数量。如果数量为0或小于0,则返回一个空数组。
4.3绘制汉明窗
import numpy as np
from matplotlib.pyplot import plot, show
# (1) 调用hamming函数,以计算汉明窗:
window = np.hamming(42)
# (2) 使用Matplotlib绘制汉明窗:
plot(window)
show()
4.4凯泽窗
凯泽窗(Kaiser window)是以贝塞尔函数(Bessel function)定义的,公式如下所示。
这里的I0即为零阶的贝塞尔函数。NumPy中的kaiser函数返回凯泽窗。该函数的第一个参 数为输出点的数量。如果数量为0或小于0,则返回一个空数组。第二个参数为β值。
import numpy as np
from matplotlib.pyplot import plot, show
# (1) 调用kaiser函数,以计算凯泽窗:
window = np.kaiser(42, 14)
# (2) 使用Matplotlib绘制凯泽窗:
plot(window)
show()
4.5 绘制修正的贝塞尔函数
import numpy as np
from matplotlib.pyplot import plot, show
# (1) 使用NumPy的linspace函数生成一组均匀分布的数值。
x = np.linspace(0, 4, 100)
# (2) 调用i0函数进行计算:
vals = np.i0(x)
# (3) 使用Matplotlib绘制修正的贝塞尔函数:
plot(x, vals)
show()
4.6绘制sinc 函数
import numpy as np
from matplotlib.pyplot import plot, show
# (1) 使用NumPy的linspace函数生成一组均匀分布的数值。
x = np.linspace(0, 4, 100)
# (2) 调用sinc函数进行计算:
vals = np.sinc(x)
# (3) 使用Matplotlib绘制sinc函数:
plot(x, vals)
show()