1. 程式人生 > >python numpy--專用函式

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