標籤:
1.常規函數與排序
常用統計函數:
求和:sum()、均值:mean()、標準差:std()、方差:var()、最小值:min()、最大值:max()、最大值與最小值之差:ptp()、最大值的下標:argmax()、最小值的下標:argmin()、中值:median()
上述函數都可以指定axis,來沿著某一軸操作;除了mean()函數求均值,還可以使用average(),並且可以指定weights參數來指定權值,計算加權平均;argmax()和argmin()如果不指定axis參數,則返回平坦化後的下標;
排序函數:sort()、argsort();數組的sort()方法會對數組本身進行改變,而sort()函數則不會;sort預設axis=-1,即沿著最後一個軸進行排序;sort()函數返回一個新的排序後的數組而argsort()則返回排序後的下標數組,如:
import numpy as np
a = np.random.randint(0,10,size=(4,5))
array([[8, 2, 0, 3, 7],
[7, 0, 2, 7, 4],
[1, 8, 1, 1, 2],
[4, 6, 2, 1, 4]])
a.sort() ? #此時a數組會改變為排序後的數組;
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]])
# 即沿著-1軸排序後的結果
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()
?
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維數組進行長條圖統計
?
??
python科學計算_numpy_函數庫