numpy学习笔记6——常用函数5

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]]

在这里插入图片描述

©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页