python numpy--專用函式
一、排序函式
1、ndarray類的sort方法——可對陣列進行原地排序;
import numpy as np
# 準備一個矩陣
a = np.mat('3 1 2; 0 5 4; 7 3 6')
a
matrix([[3, 1, 2],
[0, 5, 4],
[7, 3, 6]])
np.sort(a) #使用函式進行排序
matrix([[1, 2, 3],
[0, 4, 5],
[3, 6, 7]])
以下加入axis:
np.sort(a,axis=1) #橫著排序
matrix([[1, 2, 3], [0, 4, 5], [3, 6, 7]])
np.sort(a,axis=0) #列排序
matrix([[0, 1, 2],
[3, 3, 4],
[7, 5, 6]])
2.argsort函式——返回輸入陣列排序後的下標;
# argsort()
print(a)
np.argsort(a)
[[3 1 2]
[0 5 4]
[7 3 6]]
matrix([[1, 2, 0],
[0, 2, 1],
[1, 2, 0]], dtype=int64)
print(a)
np.argsort(a,axis = 0) #豎著排,預設的時axis=0(橫著排)
[[3 1 2]
[0 5 4]
[7 3 6]]
matrix([[1, 0, 0],
[0, 2, 1],
[2, 1, 2]], dtype=int64)
二、搜尋函式
1. np.argmax函式——返回陣列中最大值對應的下標 ,忽略NAN
arr1 = np.array([1 ,8 ,6 ,np.nan ,20 ,0])
arr1
array([ 1., 8., 6., nan, 20., 0.])
np.argmax(arr1)
3
看看多維的陣列是什麼情況捏~~~
f = np.mat('2 3 4;4 3 4 ;3 4 5;80,7,90' )
print(np.argmax(f))
11
2.np.nanargmax函式——返回陣列中最大值對應的下標 ,不忽略NAN
arr1
array([ 1., 8., 6., nan, 20., 0.])
np.nanargmax(arr1)
4
3. argwhere( ) 返回符合條件的下標
arr1
array([ 1., 8., 6., nan, 20., 0.])
np.where(arr1<8)
D:\Anaconda3\lib\site-packages\ipykernel_launcher.py:1: RuntimeWarning: invalid value encountered in less
"""Entry point for launching an IPython kernel.
(array([0, 2, 5], dtype=int64),)
arr1<8
D:\Anaconda3\lib\site-packages\ipykernel_launcher.py:1: RuntimeWarning: invalid value encountered in less
"""Entry point for launching an IPython kernel.
array([ True, False, True, False, False, True])
np.argwhere(arr1<8)
D:\Anaconda3\lib\site-packages\ipykernel_launcher.py:1: RuntimeWarning: invalid value encountered in less
"""Entry point for launching an IPython kernel.
array([[0],
[2],
[5]], dtype=int64)
4. searchsorted( ) 為指定的插入值尋找 維持 排序 的 索引位置。 使用二分法
注: 如果輸入的 陣列 不是 range() 之類,沒有排序的,一定要先排序
a = np.array([0,1,70,3,4,80,90])
a.sort()
a
array([ 0, 1, 3, 4, 70, 80, 90])
index = np.searchsorted(a,60)
index
4
在不打亂 a 排序的基礎上插入b .返回b 每個數如果插入的話對應的位置
b = np.array([-5,7])
b
array([-5, 7])
indices = np.searchsorted(a,b)
indices
array([0, 4], dtype=int64)
三、陣列元素的抽取
1、extract函式——根據某個條件從陣列中抽取元素
arr = np.array(np.arange(8))
arr
array([0, 1, 2, 3, 4, 5, 6, 7])
list2 = [x for x in range(20) if x%2==0]
list2
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
condition = (arr%2==0)
condition
array([ True, False, True, False, True, False, True, False])
arr1 = np.extract(condition,arr)
arr1
array([0, 2, 4, 6])
arr[arr%2==0]
array([0, 2, 4, 6])
arr2 = np.random.randint(0,50,20)
print(arr2)
np.extract((arr2%2==0),arr2)
[18 47 38 11 17 17 8 39 37 9 2 25 31 28 38 48 10 22 22 25]
array([18, 38, 8, 2, 28, 38, 48, 10, 22, 22])
3種讀取條件的方式
import numpy as np
g = np.arange(20)
print('where:',np.where(g>10))
print('extract:',np.extract(g>10,g))
print('直接讀取:',g[g>10])
2. np.nonzero( ) 專門用來抽取非零元素
np.nonzero(np.arange(5))
(array([1, 2, 3, 4], dtype=int64),)
四、金融函式
1. np.fv函式
計算所謂的終值(future value),終值是基於一些假設給出的某個金融 資產在未來某一時間點的價值。
終值有以下4個引數決定——利率、期數、每期支付金額以及現值
語法格式如下: numpy.fv(rate, nper, pmt, pv[, when='end’])
#引數:
rate:每一期的利率(rate of interest)。
nper:期數。
pmt:payment。每期支付金額
pv:present value,現值。
when:{{‘begin’, 1}, {‘end’, 0}}, {string, int}, optional. 每一期的開頭還是結尾付
舉例:某使用者去銀行存款,假設年利率3%、每季度續存金額10元、存5年以及存款1000,則計算5年後可領取多少金額。
np.fv(0.03/4,4*5,-10,-1000) # 從身上給出去,所以是“-”號
1376.0963320407982
2.pv函式
計算現值(present value)是指資產在當前時刻的價值。 現值有以下4個引數決定——利率、期數、每期支付金額以及終值
語法格式如下: numpy.fv(rate, nper, pmt, fv[, when='end’])
引數:
rate:每一期的利率(rate of interest)。
nper:期數。
pmt:payment。每期支付金額
fv: future value,終值。
when:{{‘begin’, 1}, {‘end’, 0}}, {string, int}, optional. 每一期的開頭還是結尾付
舉例:某使用者去銀行存款,假設年利率3%、每季度續存金額10元、存5年後可領1376.0963320,則計算5年前存取的本金是多少金額。
np.pv(0.03/4,4*5,-10,1376.0963320407982)
-1000.0
3.np.npv(rate,values)函式 淨現值
定義為按折現率計算的淨現金流之和。
淨現值是指投資方案所產生的【現金淨流量】(流入-流出)以資金成本為貼現率折現之後與原始投資額現值的差額
經濟意義
NPV>0表示專案實施後,除保證可實現預定的收益率外,尚可獲得更高的收益。
NPV<0表示專案實施後,未能達到預定的收益率水平,而不能確定專案已虧損。
NPV=0表示專案實施後的投資收益率正好達到預期,而不是投資專案盈虧平衡
語法格式如下: numpy.npv(rate, values)
引數:
rate:折現率。
values: 現金流,正數代表‘收入’或‘取款’,負數代表‘投資’或‘存款’。 第一個值
必須是初始的投資,也就是必須是負數
舉例:投資100,支出39、59、55、20。折現率為28.1%,則淨現值為:
np.npv(0.281,[-100,39,59,55,20])
-0.00847859163845488
4.pmt函式–根據本金和利率計算每期需支付的金額
語法格式如下: numpy.pmt(rate, nper, pv[, fv=0, when='end’])
引數:
rate:每一期的利率(rate of interest)
nper:期數
pv:present value,現值
舉例:某同學房貸20萬,準備15年還清,年利率為7.5%,則每
月需還貸多少金額?
np.pmt(0.075/12,12*15,200000)
-1854.0247200054619
5.nper()函式,計算定期付款的期數
語法格式如下: numpy.nper(rate, pmt, pv, fv=0, when=‘end’)
引數:
rate:每一期的利率(rate of interest)
pmt:每期支付的金額
pv:present value,現值
fv: 終值
舉例:某同學房貸20萬,年利率為7.5%,每月能還貸2000,則
需要還多少期?
np.nper(0.075/12,-2000,200000) #得到的是月份
array(157.42258585)
np.nper(0.075/12,-2000,200000)/12 #得到的是年份
13.118548820826762
6.利率 rate()
語法格式如下: numpy.rate(nper, pmt, pv, fv)
引數:
nper :需還的期數
pmt:每期支付的金額
pv:present value,現值
fv: 終值
舉例:某同學房貸20萬,需還14年,每月能還貸2000,則年利
率為多少?
np.rate(12*14,-2000,200000,0) #這個是月利率
0.006793800917143923
np.rate(12*14,-2000,200000,0)*12 #這是年利率
0.08152561100572708
【小練習】小明房貸70萬,年利率4%,準備還20年,
則每月月供多少?
np.pmt(0.04/12,12*20,700000)
-4241.862305095867
-np.pmt(0.04/12,12*20,700000)*12*20-700000 # 多還這麼多
318046.95322300796