python科學計算_numpy_函數庫

1.常規函數與排序

經常使用統計函數:linux

求和:sum()、均值:mean()、標準差:std()、方差:var()、最小值:min()、最大值:max()、最大值與最小值之差:ptp()、最大值的下標:argmax()、最小值的下標:argmin()、中值:median()數組

上述函數均可以指定axis,來沿着某一軸操做;除了mean()函數求均值,還可使用average(),而且能夠指定weights參數來指定權值,計算加權平均;argmax()和argmin()若是不指定axis參數,則返回平坦化後的下標;dom

排序函數:sort()、argsort();數組的sort()方法會對數組自己進行改變,而sort()函數則不會;sort默認axis=-1,即沿着最後一個軸進行排序;sort()函數返回一個新的排序後的數組而argsort()則返回排序後的下標數組,如:函數

import numpy as np
a = np.random.randint(0,10,size=(4,5))orm

array([[8, 2, 0, 3, 7],
[7, 0, 2, 7, 4],
[1, 8, 1, 1, 2],
[4, 6, 2, 1, 4]])對象

a.sort()   #此時a數組會改變爲排序後的數組;blog

a1 = np.sort(a)   #此時a數組不變,獲得的a1數組爲:排序

array([[0, 2, 3, 7, 8],
[0, 2, 4, 7, 7],
[1, 1, 1, 2, 8],
[1, 2, 4, 4, 6]])it

# 即沿着-1軸排序後的結果io

idx = np.argsort(a) 

idx

array([[2, 1, 3, 4, 0],
[1, 2, 4, 0, 3],
[0, 2, 3, 4, 1],
[3, 2, 0, 4, 1]])

此時,雖然idx.shape = (4,5),可是並不能直接使用a[idx]獲得排序後的數組,由於idx是數組,因此numpy會在後面補:,等效於:a[idx,:],idx數組中的每一個值訪問a數組的0軸,當idx中的值超過a的0軸長度以後就會產生錯誤:IndexError: index 4 is out of bounds for axis 0 with size 4;因此使用idx來訪問a獲得排序後的數組,須要產生0軸的下標,經過np.ogrid對象能夠生成:

x,_ = np.ogrid[:a.shape[0],:a.shape[1]]

右邊的表達式生成a數組的grid,即各個軸的下標數組,取第一個元素即獲得a數組的0軸下標數組:

array([[0],
[1],
[2],
[3]])

經過a[x,idx]能夠正確訪問到排序後的數組

2. 多項式函數

多項式函數是隻包含加法和乘法,對一個變量的各次冪進行加法和乘法操做的函數:

f(x) = a[n]*x^n + a[n-1]*x^(n-1) + … + a[2]*x^2 + a[1]*x + a[0]

numpy中經過將變量x的各次冪(從高到底的順序)係數便可表示一個多項式函數:

a = np.array([1.0,0,-2,1])

p = np.poly1d(a)

p是一個poly1d對象,此對象能夠像函數同樣調用,而且返回多項式的值,而且是一個ufunc對象,便可以以數組做爲參數,獲得相應的多項式值的數組;

poly1d對象能夠進行四則運算,分別對應於多項式的四則運算,除法運算時,會返回包含兩個值的元組,其中第一個值爲商多項式(商式),第二個值爲餘數多項式(餘式);

poly1d對象能夠進行積分:deriv()和微分:integ()操做,獲得新的多項式;

使用np.roots()函數,能夠對多項式進行求根:

r = np.roots(p)

array([-1.61803399,  1.        ,  0.61803399])

使用np.poly()函數,能夠將根轉回多項式的係數:

np.poly(r)

array([ 1.00000000e+00, -1.22124533e-15, -2.00000000e+00,
1.00000000e+00])

使用np.polyfit()函數,能夠對一組數據進行多項式擬合:

import matplotlib.pyplot as plt
plt.figure(figsize=(8,4))
for deg in [3,5,7]:
    a = np.polyfit(x,y,deg)
    error = np.abs(np.polyval(a,x)-y)
    plt.plot(error)
plt.ylim(0,0.0001)
plt.show()

NewImage 

3.分段函數

經過三個函數實現分段操做:where()、select()、piecewise()

where(condition,x,y)函數相似於三目操做符,當condition爲真時,返回x,不然返回y;若是x和y的形狀不一致,則經過廣播統一形狀;

當分段的數量比較多時,where()函數寫起來就比較複雜,select(condlist, choicelist)函數,經過一個長度爲N的布爾數組列表,choicelist則是一個長度爲N的存儲候選值的數組列表,其中全部數組長度爲M;

condlist能夠形象地理解爲多個分段的條件,N爲分段的數量;choicelist則是每種條件下的取值,用if-elif-else表現爲:

if condlist[0] :
    choicelist[0]
elif condlist[1]:
    choicelist[1]
elif condlist[2]:
    choicelist[2]

等;

piecewise(x, condlist, funclist)函數是爲了不當分段比較多時,須要用不少的數組來存儲分段結構,piecewise()函數能夠直接經過分段列表計算出結果,而不須要中間的分段數組;和select()參數不一樣的是,funclist是一個函數列表,分別對應condlist中的條件執行;

4.統計函數

unique()函數返回參數數組中全部不一樣的值,並按照從小到大排序,至關於linux中的sort -u 命令;該函數有兩個可選參數:

return_index: True 表示同時返回原始數組的下標;

return_inverse :True 表示同時返回重建原始數組用的下標數組;

bincount()函數統計整數數組中各個元素出現的次數(參數數組中全部的元素必須爲非負數),返回數組中的第i個元素表示整數i在參數數組中出現的個數。

histogram(a, bins=10, range=None, normed=False, weights=None)函數對一維數組進行直方圖統計;該函數返回兩個一維數組:hist和bin_edges;

histogram2d()、histogramdd()對二維數組和n維數組進行直方圖統計

相關文章
相關標籤/搜索