Numpy(五)专用函数

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()



你可能感兴趣的:(Python)