当前位置: 移动技术网 > IT编程>脚本编程>Python > numpy常用函数介绍

numpy常用函数介绍

2020年09月29日  | 移动技术网IT编程  | 我要评论
文章目录排序与搜索函数sort函数argsort函数lexsort函数复数排序搜索函数金融函数终值现值净现值内部收益率分期付款窗函数巴特利特窗布莱克曼窗汉明窗凯泽窗两个重要函数贝塞尔函数sinc函数import numpy as np排序与搜索函数sort函数a = np.array([ [5,8,9,3,2,4,1,0,4], [8,7,2,4,6,3,0,1,5] ])print('按照行进行排列')print(np.sort(a,axis=1))pr



import numpy as np 

排序与搜索函数

sort函数

a = np.array([ [5,8,9,3,2,4,1,0,4], [8,7,2,4,6,3,0,1,5] ]) print('按照行进行排列') print(np.sort(a,axis=1)) print('按照列进行排列') print(np.sort(a,axis=0)) print('msort') print(np.msort(a)) #等价于np.sort(a,axis=0) #数组的sort方法 print('排序后的数组a') a.sort() #排序 print(a) 
按照行进行排列
[[0 1 2 3 4 4 5 8 9]
 [0 1 2 3 4 5 6 7 8]]
按照列进行排列
[[5 7 2 3 2 3 0 0 4]
 [8 8 9 4 6 4 1 1 5]]
msort
[[5 7 2 3 2 3 0 0 4]
 [8 8 9 4 6 4 1 1 5]]
排序后的数组a
[[0 1 2 3 4 4 5 8 9]
 [0 1 2 3 4 5 6 7 8]] 

argsort函数

函数返回排序后元素在原数组的下标

a = np.array([1,2,5,6,7,9,0]) index = np.argsort(a) print(index) 
[6 0 1 2 3 4 5] 

lexsort函数

lexsort根据字典的键值进行排序。lexsort((b,a))的输入函数有两个数组,首先先对a进行从小到达的排序,若a中有相同的元素,则安装a对应的b中元素进行排序。

a = np.array([1,5,2,6,1,4,8]) b = np.array([2,4,3,6,8,7,1]) print('a和b') print(np.lexsort((b,a))) # a中有两个元素一样(1),在a中的索引为0和4,根据两个元素在b中对应的元素(2,8)所以两者的排序应该为(0,4) print('a和c') c = np.array([8,4,3,6,2,7,1]) print(np.lexsort((c,a))) # a中有两个元素一样(1),在a中的索引为0和4,根据两个元素在c中对应的元素(8,2)所以两者的排序应该为(4,0) print('a和d') d = np.array([8,4,3,6,8,7,1]) print(np.lexsort((d,a))) # a中有两个元素一样(1),在a中的索引为0和4,根据两个元素在c中对应的元素(8,8)则保留a中的前后顺序 print('e和bcd') e = np.array([1,5,2,6,3,4,8]) #a中没有重重复 则跟b、c、d无关 print(np.lexsort((b,e))) print(np.lexsort((c,e))) print(np.lexsort((d,e))) 
a和b
[0 4 2 5 1 3 6]
a和c
[4 0 2 5 1 3 6]
a和d
[0 4 2 5 1 3 6]
e和bcd
[0 2 4 5 1 3 6]
[0 2 4 5 1 3 6]
[0 2 4 5 1 3 6] 

复数排序

在数学中除了虚部为0的复数可以比较大小(实数),其他的复数不可以比较大小。但sort_complex()可以对复数进行排序:按照先实部后虚部的方式对复数进排序。

#随机生成一个复数数组 complex_numbers = np.random.random(5) + 1j* np.random.random(5) print(complex_numbers.dtype) print('排序前') print(complex_numbers) #排序 print('排序后') print(np.sort_complex(complex_numbers)) 
complex128
排序前
[0.0020903 +0.69747244j 0.66594968+0.24774604j 0.174358  +0.32293334j
 0.19076943+0.08302702j 0.11000828+0.61031748j]
排序后
[0.0020903 +0.69747244j 0.11000828+0.61031748j 0.174358  +0.32293334j
 0.19076943+0.08302702j 0.66594968+0.24774604j] 

搜索函数

#argmax寻找最大值所在的下标 print('最大值下标') a = np.array([1,2,6,5,4,8,9,5]) print(np.argmax(a)) #nanargmax寻找最大值所在的下标 但不包含nan值(但是nan值占据一个索引值) b = np.array([1,2,6,np.nan,5,4,8,9,0,5,np.nan]) print(np.nanargmax(b)) #argmin寻找最小值所在的下标 print('最小值下标') c = np.array([1,2,6,5,4,8,9,5]) print(np.argmin(c)) #nanargmin寻找最小值所在的下标 但不包含nan值(但是nan值占据一个索引值) d = np.array([1,2,6,np.nan,5,4,0,8,9,5,np.nan]) print(np.nanargmin(d)) #argwhere寻找满足条件非0元素下标 print('条件搜索') e = np.array([1,2,5,6,8,7,9,4,0]) print(np.argwhere(e<=5)) #searchsorted函数:返回指定的元素在原有数组的位置 此时a必须为升序序列 #searchsorted(a,(a1,a2)):返回a1,a2在a的下标位置 print('顺序插入') a = np.arange(10) index = np.searchsorted(a,[-2,6]) print(index) #插入 b = np.insert(a,index,[-2,6]) print(b) #extract抽取函数 #extract(condition,a) 根据donditon条件(布尔值数组)抽取a中的元素 print('抽取') a = np.arange(10) condition = (a%2==0) print(condition) b = np.extract(condition,a) print(a) print(b) #nonzero函数抽取非0元素 c = np.nonzero(a) print(c) #元组 print(c[0]) 
最大值下标
6
7
最小值下标
0
6
条件搜索
[[0]
 [1]
 [2]
 [7]
 [8]]
顺序插入
[0 6]
[-2  0  1  2  3  4  5  6  6  7  8  9]
抽取
[ True False  True False  True False  True False  True False]
[0 1 2 3 4 5 6 7 8 9]
[0 2 4 6 8]
(array([1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int64),)
[1 2 3 4 5 6 7 8 9] 

金融函数

终值

某个资金在未来某一个时间点的价值,终值取决于四个参数——利率、期数、每期支付金额以及现值

rate = 0.03 #年利率 pmt = 10 #每个月支付金额 pv = 1000 #现值 nper = 5 #周期 print(str(nper)+'年后的终值') print(np.fv(rate/12, nper*12, -pmt, -pv)) #画出图表示趋势 import matplotlib.pyplot as plt %matplotlib inline
fvs = [] for i in range(10): fv = np.fv(rate/12, i*12, -pmt, -pv) fvs.append(fv) plt.plot(fvs) plt.title('the final vaule of rate=0.03,present value=1000,Monthly paymment=10 ') 
5年后的终值
1808.0839077763526 

在这里插入图片描述

现值

现值是终值的镜像对称,输入终值输出为现值。

rate = 0.03 #年利率 pmt = 10 #每个月支付金额 fv = 1808.0839077763526 #终值 nper = 5 #周期 print(str(nper)+'后' + str(fv)+ '的现值') print((-np.pv(rate/12, nper*12, -pmt, fv))) #需要加一个负号 
5后1808.0839077763526的现值
1000.0000000000001 

净现值

净现值指的是的未来资金流入现值与未来资金流出现值的差额。公式:
N P V = ∑ n I t 1 + R − ∑ n O t 1 + R NPV = \sum_n \frac{I_t}{1+R} - \sum_n \frac{O_t}{1+R} NPV=n1+RItn1+ROt

其中 I t I_t It表示第t年的现金流入量, O t O_t Ot表示第t年的现金流出量,R为折现率,n为寿命周期

#随机生成现金流 cashflows = np.random.randint(100,size=5) print(cashflows) rate = 0.03 #折现率 print(np.npv(rate,cashflows)) 
[43 54 48 60 17]
210.68456748019594 

内部收益率

内部收益率是指净现率为0时的有效利率

#随机生成现金流 cashflows = np.random.randint(100,size=5) cashflows = np.insert(cashflows,0,-100) print(cashflows) print(np.irr(cashflows)) 
[-100   12   75   95   74   73]
0.4661916053986477 

分期付款

#计算每个月需要还款资金 value = 1000000 #贷款金额 rate = 0.1 #年利率 T = 12*30 #还款时间(30年) print(np.pmt(rate/12, T, value)) #计算付款期数 value = 9000 #贷款金额 rate = 0.1 #年利率 pmv = 100 #每个月的还款金额 print(np.nper(rate/12,-pmv, value)) #计算利率 nper = 167 #付款期数 pwv = 100 #每月付款金额 value = 9000 #贷款金额(现值) fv = 0 #终值 print(12 * np.rate(nper, -pwv, value, fv)) 
-8775.715700887993
167.04751180075235
0.09997564206640422 

窗函数

窗函数是信号处理领域的数学函数,可以用于谱分析和滤波器设置。利用信号经过窗函数,可以对信号进行滤波处理。


时域表示为 x n ( n ) = x ( n ) w ( n ) x_n(n)=x(n)w(n) xn(n)=x(n)w(n),其中 w ( n ) w(n) w(n)表示窗函数。


频域表示为 x N ( e j w ) = 1 2 π ∫ − π + π X ( e j θ ) W ( e j ( w − θ ) ) d θ x_N(e^{jw}) =\frac{1}{2\pi}\int_{-\pi}^{+\pi}X(e^{j\theta})W(e^{j(w-\theta)}){\rm d}\theta xN(ejw)=2π1π+πX(ejθ)W(ej(wθ))dθ

巴特利特窗

时域表达式


n为奇数时:

w ( k ) = { 2 ( k − 1 ) n − 1 , 1 ≤ k ≤ n + 1 2 2 − 2 ( k − 1 ) n − 1 , n + 1 2 ≤ k ≤ n w(k)=\begin{cases} \frac{2(k-1)}{n-1},&\text{$1\leq k\leq \frac{n+1}{2}$}\\ 2- \frac{2(k-1)}{n-1},&\text{$\frac{n+1}{2} \leq k \leq n$} \end{cases} w(k)={n12(k1),2n12(k1),1k2n+12n+1kn
n为偶数时:

w ( k ) = { 2 ( k − 1 ) n − 1 , 1 ≤ k ≤ n 2 2 ( n − k ) n − 1 , n 2 ≤ k ≤ n w(k)=\begin{cases} \frac{2(k-1)}{n-1},&\text{$1\leq k\leq \frac{n}{2}$}\\ \frac{2(n-k)}{n-1},&\text{$\frac{n}{2} \leq k \leq n$} \end{cases} w(k)={n12(k1),n12(nk),1k2n2nkn

N = 42 win = np.bartlett(N) print(win) plt.plot(win) 
[0.         0.04878049 0.09756098 0.14634146 0.19512195 0.24390244
 0.29268293 0.34146341 0.3902439  0.43902439 0.48780488 0.53658537
 0.58536585 0.63414634 0.68292683 0.73170732 0.7804878  0.82926829
 0.87804878 0.92682927 0.97560976 0.97560976 0.92682927 0.87804878
 0.82926829 0.7804878  0.73170732 0.68292683 0.63414634 0.58536585
 0.53658537 0.48780488 0.43902439 0.3902439  0.34146341 0.29268293
 0.24390244 0.19512195 0.14634146 0.09756098 0.04878049 0.        ] 

在这里插入图片描述

布莱克曼窗

时域表达式为:


w ( k ) = 0.42 − 0.5 c o s ( 2 π k − 1 N − 1 ) + 0.08 c o s ( 4 π k − 1 N − 1 ) 其 中 k = 1 , 2... N w(k)=0.42-0.5cos(2\pi \frac{k-1}{N-1})+0.08cos(4\pi \frac{k-1}{N-1}) 其中k=1,2...N w(k)=0.420.5cos(2πN1k1)+0.08cos(4πN1k1)k=12...N

N = 42 win = np.blackman(N) print(win) plt.plot(win) 
[-1.38777878e-17  2.13149947e-03  8.73615283e-03  2.04152544e-02
  3.80766699e-02  6.28034219e-02  9.56887743e-02  1.37654687e-01
  1.89272426e-01  2.50604249e-01  3.21083369e-01  3.99446079e-01
  4.83725183e-01  5.71308263e-01  6.59058284e-01  7.43488176e-01
  8.20975879e-01  8.88002389e-01  9.41392953e-01  9.78540956e-01
  9.97595334e-01  9.97595334e-01  9.78540956e-01  9.41392953e-01
  8.88002389e-01  8.20975879e-01  7.43488176e-01  6.59058284e-01
  5.71308263e-01  4.83725183e-01  3.99446079e-01  3.21083369e-01
  2.50604249e-01  1.89272426e-01  1.37654687e-01  9.56887743e-02
  6.28034219e-02  3.80766699e-02  2.04152544e-02  8.73615283e-03
  2.13149947e-03 -1.38777878e-17] 

在这里插入图片描述

汉明窗

时域表达式为:


w ( k ) = 0.54 + 0.46 c o s ( 2 π n N − 1 ) 其 中 0 ≤ n ≤ N − 1 w(k)=0.54 + 0.46cos(\frac{2\pi n}{N-1}) 其中 0 \leq n \leq N-1 w(k)=0.54+0.46cos(N12πn)0nN1

N = 42 win = np.hamming(N) print(win) plt.plot(win) 
[0.08       0.08539101 0.10143766 0.12776384 0.16375249 0.20856007
 0.26113631 0.32024888 0.38451224 0.45242009 0.52238074 0.59275438
 0.66189149 0.72817157 0.79004107 0.84604982 0.89488502 0.93540202
 0.96665113 0.98789989 0.99865027 0.99865027 0.98789989 0.96665113
 0.93540202 0.89488502 0.84604982 0.79004107 0.72817157 0.66189149
 0.59275438 0.52238074 0.45242009 0.38451224 0.32024888 0.26113631
 0.20856007 0.16375249 0.12776384 0.10143766 0.08539101 0.08      ] 

在这里插入图片描述

凯泽窗

时域表达式为:


w ( n ) = I 0 ( β 1 − 4 n 2 ( M − 1 ) 2 ) I 0 ( β ) 其 中 k = 1 , 2... N w(n)= \frac{I_0(\beta \sqrt{1-\frac{4n^2}{(M-1)^2}})}{I_0(\beta)} 其中k=1,2...N w(n)=I0(β)I0(β1(M1)24n2 )k=12...N
其中 I 0 I_0 I0为贝塞尔函数

N = 42 beta = 14 win = np.kaiser(N, beta) print(win) plt.plot(win) 
[7.72686684e-06 1.15257277e-04 5.34636294e-04 1.70718596e-03
 4.40899892e-03 9.84900072e-03 1.97236049e-02 3.61906696e-02
 6.17307635e-02 9.88798484e-02 1.49843192e-01 2.16031313e-01
 2.97588174e-01 3.93001697e-01 4.98889955e-01 6.10039172e-01
 7.19732557e-01 8.20357807e-01 9.04225844e-01 9.64485999e-01
 9.95994872e-01 9.95994872e-01 9.64485999e-01 9.04225844e-01
 8.20357807e-01 7.19732557e-01 6.10039172e-01 4.98889955e-01
 3.93001697e-01 2.97588174e-01 2.16031313e-01 1.49843192e-01
 9.88798484e-02 6.17307635e-02 3.61906696e-02 1.97236049e-02
 9.84900072e-03 4.40899892e-03 1.70718596e-03 5.34636294e-04
 1.15257277e-04 7.72686684e-06] 

在这里插入图片描述

两个重要函数

贝塞尔函数

定义

贝塞尔函数是下列常微分方程(贝塞尔方程)的标准解
x 2 d 2 y d x 2 + x d y d x + ( x 2 − n 2 ) y = 0 x^2\frac{d^2y}{dx^2}+x\frac{dy}{dx}+(x^2-n^2)y=0 x2dx2d2y+xdxdy+(x2n2)y=0
n阶第一类贝塞尔方程
J n ( x ) = ∑ 0 ∞ ( − 1 ) m m ! Γ ( n + m + 1 ) ( x 2 ) n + 2 m J_n(x)=\sum_0^{\infty}\frac{(-1)^m}{m! \Gamma (n+m+1) } (\frac{x}{2})^{n+2m} Jn(x)=0m!Γ(n+m+1)(1)m(2x)n+2m
n阶第二类贝塞尔方程(诺伊曼函数)
Y n ( x ) = J n ( x ) c o s ( n π ) − J − n ( x ) s i n ( n π ) Y_n(x)=\frac{J_n(x)cos(n\pi)-J_{-n}(x)}{sin (n\pi)} Yn(x)=sin(nπ)Jn(x)cos(nπ)Jn(x)
其中 Γ \Gamma Γ函数的定义为
Γ ( p ) = ∫ 0 ∞ e − x x p − 1 d x \Gamma(p)=\int_0^{\infty}e^{-x}x^{p-1}{\rm d}x Γ(p)=0exxp1dx
拥有性质 Γ ( p + 1 ) = p Γ ( p ) \Gamma(p+1)=p\Gamma(p) Γ(p+1)=pΓ(p) Γ ( 1 ) = 1 \Gamma(1)=1 Γ(1)=1 Γ ( 1 2 ) = π \Gamma(\frac{1}{2})=\sqrt{\pi} Γ(21)=π

#0阶贝塞尔函数 x = np.linspace(0,4,100) vals = np.i0(x) #0阶贝塞尔 plt.plot(x,vals) 

在这里插入图片描述

sinc函数

sanc函数的表达式为: s i n c ( x ) = s i n ( π x ) π x sinc(x)=\frac{sin(\pi x)}{\pi x} sinc(x)=πxsin(πx)

与此类似的是sa函数: s a ( x ) = s i n ( x ) x sa(x)=\frac{sin(x)}{x} sa(x)=xsin(x)

两个函数的关系是:

  1. Sa函数是sinc函数的非归一化表示
  2. S i n c ( x ) = S a ( π x ) Sinc(x)=Sa(\pi x) Sinc(x)=Sa(πx)
    二维sinc函数是一维的扩展,表示式为:
    s i n ( x , y ) = s i n ( π x ) π x s i n ( π y ) π y sin(x,y)=\frac{sin(\pi x)}{\pi x} \frac{sin(\pi y)}{\pi y} sin(x,y)=πxsin(πx)πysin(πy)
#sinc函数 x = np.linspace(0,4,100) y1 = np.sinc(x) # plt.plot(x,y1)  y2 = np.sin(np.pi*x)/(np.pi*x) # plt.plot(x,y2) #与上面一致 #sa函数 y3 = np.sin(x)/(x) plt.plot(x,y2) #与上面重合 

在这里插入图片描述

#二维sinc函数 x = np.linspace(0,4,100) xx = np.outer(x,x) #计算外积 数组两两相乘 print(xx) y1 = np.sinc(xx) plt.plot(x,y1) 
[[0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00
  0.00000000e+00 0.00000000e+00]
 [0.00000000e+00 1.63248648e-03 3.26497296e-03 ... 1.58351189e-01
  1.59983675e-01 1.61616162e-01]
 [0.00000000e+00 3.26497296e-03 6.52994592e-03 ... 3.16702377e-01
  3.19967350e-01 3.23232323e-01]
 ...
 [0.00000000e+00 1.58351189e-01 3.16702377e-01 ... 1.53600653e+01
  1.55184165e+01 1.56767677e+01]
 [0.00000000e+00 1.59983675e-01 3.19967350e-01 ... 1.55184165e+01
  1.56784002e+01 1.58383838e+01]
 [0.00000000e+00 1.61616162e-01 3.23232323e-01 ... 1.56767677e+01
  1.58383838e+01 1.60000000e+01]] 

在这里插入图片描述

本文地址:https://blog.csdn.net/qq_43260356/article/details/108861889

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网