7.1 排序
NumPy提供了多种排序函数,如下所示:
sort函数返回排序后的数组;
lexsort函数根据键值的字典序进行排序;
argsort函数返回输入数组排序后的下标;
ndarray类的sort方法可对数组进行原地排序;
msort函数沿着第一个轴排序;
sort_complex函数对复数按照先实部后虚部的顺序进行排序。
7.2 按字典序排序
lexsort函数返回输入数组按字典序排序后的下标
Sort names: first by surname, then by name.
>>> surnames = ('Hertz', 'Galilei', 'Hertz')
>>> first_names = ('Heinrich', 'Galileo', 'Gustav')
>>> ind = np.lexsort((first_names, surnames))
>>> ind
array([1, 2, 0])
>>>
>>> [surnames[i] + ", " + first_names[i] for i in ind]
['Galilei, Galileo', 'Hertz, Gustav', 'Hertz, Heinrich']
Sort two columns of numbers:
>>> a = [1,5,1,4,3,4,4] # First column
>>> b = [9,4,0,4,0,2,1] # Second column
>>> ind = np.lexsort((b,a)) # Sort by a, then by b
>>> print ind
[2 0 4 6 5 3 1]
>>>
>>> [(a[i],b[i]) for i in ind]
[(1, 0), (1, 9), (3, 0), (4, 1), (4, 2), (4, 4), (5, 4)]
7.4 对复数进行排序(略)
7.5 搜索
argmax函数返回数组中最大值对应的下标。
>>> a = np.array([2, 4, 8])
>>> np.argmax(a)
2
nanargmax函数提供相同的功能,但忽略NaN值。
>>> b = np.array([np.nan, 2, 4])
>>> np.nanargmax(b)
2
argmin和nanargmin函数的功能类似,只不过换成了最小值。
argwhere函数根据条件搜索非零的元素,并分组返回对应的下标。
>>> a = np.array([2, 4, 8])
>>> np.argwhere(a <= 4)
array([[0],[1]])
searchsorted函数可以为指定的插入值寻找维持数组排序的索引位置。该函数使用二分搜索算法,计算复杂度为O(log(n))。
extract函数返回满足指定条件的数组元素。
7.6 使用searchsorted 函数
searchsorted函数为7和-2返回了索引5和0。用这些索引作为插入位置,生成数组[-2, 0, 1, 2, 3, 4, 7],这样就维持了数组的排序
import numpy as np
a = np.arange(5)
indices = np.searchsorted(a, [-2, 7]) #索引可以维持数组排序的插入位置
print "Indices", indices
#output
Indices [0 5]
print "The full array", np.insert(a, indices, [-2, 7])
#output
The full array [-2 0 1 2 3 4 7]
7.8 从数组中抽取元素
从一个数组中抽取偶数元素。
import numpy as np
a = np.arange(7)
condition = (a % 2) == 0 #生成选择偶数元素的条件变量
print "Even numbers", np.extract(condition, a)
print "Non zero", np.nonzero(a)
使用nonzero函数抽取数组中的非零元素
np.nonzero(a)
7.9 金融函数
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)。
7.10 计算终值
终值是基于一些假设给出的某个金融资产在未来某一时间点的价值。终值决定于4个参数——利率、期数、每期支付金额以及现值。在本节的教程中,我们以利率3%、每季度支付金额10、存款周期5年以及现值1 000为参数计算终值。
使用正确的参数调用fv函数,计算终值:
print "Future value", np.fv(0.03/4, 5 * 4, -10, -1000)
#output
Future value 1376.09633204
7.12 计算现值(略)
7.14 计算净现值(略)
7.16 计算内部收益率(略)
7.18 计算分期付款
pmt函数可以根据利率和期数计算贷款每期所需支付的资金。
假设贷款100万,年利率为10%,要用30年时间还完贷款,那么每月必须支付多少资金呢?使用刚才提到的参数值,调用pmt函数。
print "Payment", np.pmt(0.10/12, 12 * 30, 1000000)
#output
Payment -8775.71570089
7.20 计算付款期数
NumPy中的nper函数可以计算分期付款所需的期数。所需的参数为贷款利率、固定的月供以及贷款额。
考虑贷款9000,年利率10%,每月固定还款为100的情形。
通过nper函数计算出付款期数。
print "Number of payments", np.nper(0.10/12, -100, 9000)
#output
Number of payments 167.047511801 #需要167个月
7.22 计算利率
rate函数根据给定的付款期数、每期付款资金、现值和终值计算利率。
使用7.20节中的数值进行逆向计算,由其他参数得出利率。
填入之前教程中的数值作为参数。
print "Interest rate", 12 * np.rate(167, -100, 9000, 0)
#计算出的利率约为10%。
Interest rate 0.0999756420664
7.23 窗函数
窗函数(window function)是信号处理领域常用的数学函数,相关应用包括谱分析和滤波器设计等。这些窗函数除在给定区间之外取值均为0。NumPy中有很多窗函数,如bartlett、blackman、hamming、hanning和kaiser。
7.24 绘制巴特利特窗
巴特利特窗(Bartlett window)是一种三角形平滑窗。
window = np.bartlett(42)
plot(window)
show()
7.25 布莱克曼窗
布莱克曼窗(Blackman window)形式上为三项余弦值的加和。blackman函数返回布莱克曼窗。该函数唯一的参数为输出点的数量。如果数量为0或小于0,则返回一个空数组。
7.26 使用布莱克曼窗平滑股价数据(略)
7.27 汉明窗
汉明窗(Hamming window)形式上是一个加权的余弦函数。NumPy中的hamming函数返回汉明窗。该函数唯一的参数为输出点的数量。如果数量为0或小于0,则返回一个空数组。
7.28 绘制汉明窗
window = np.hamming(42)
plot(window)
show()
7.29 凯泽窗
凯泽窗(Kaiser window)是以贝塞尔函数(Bessel function)定义的,该函数的第一个数为输出点的数量。如果数量为0或小于0,则返回一个空数组。第二个参数为β值。
window = np.kaiser(42, 14)
plot(window)
show()
7.31 专用数学函数(略)
7.32 绘制修正的贝塞尔函数(略)
7.34 绘制sinc 函数(略)