掌握numpy(三)

目錄

掌握numpy(一)
掌握numpy(二)
掌握numpy(三)
掌握numpy(四)html

統計功能

前面都是介紹numpy的一些特性,被稱爲數學運算神器怎麼能少了統計功能呢python

ndarray的方法

a = np.array([[-2.5, 3.1, 7], [10, 11, 12]])
>>print "mean =", a.mean()
mean = 6.76666666667

上面mean沒有指定參數,是將ndarray中得全部值相加,求得均值算法

>>a.mean(axis=1) #按行求均值
array([  2.53,  11. ]) 
>>a.mean(axis=0) #按列求均值
array([ 3.75,  7.05,  9.5 ])

上面數據是2維的,若是是多維度的怎麼辦呢?數組

a = np.arange(24).reshape(2,3,4)
>>a
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],
       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])
>>a.sum(axis=0)
array([[12, 14, 16, 18],# 12=(0+12)
       [20, 22, 24, 26],#20=(4+16)
       [28, 30, 32, 34]])
>>a.sum(axis=1),
array([[12, 15, 18, 21],#12=(0+4+8)
     [48, 51, 54, 57]])
>>a.sum(axis=(0,2))
array([ 60,  92, 124])#60=(0+1+2+3 + 12+14+15+16+18)

下面是一些經常使用得數值統計方法函數

for func in (a.min,a.max,a.prod,a.std,a.var):
   >> print func.__name__ ,"=",func()
min = -2.5
max = 12.0
prod = -71610.0    #內積
std = 5.08483584352
var = 25.8555555556

數值運算方法

NumPy還 提供了許多經常使用的數值運算方法,像數值運算中的絕對值、三角和函數、對數等等。這些方法都是element-wise學習

a = np.array([[-2.5, 3.1, 7], [10, 11, 12]])
for func in (np.abs, np.sqrt, np.exp, np.log, np.sign, np.ceil, np.modf, np.isnan, np.cos):
    print"\n", func.__name__
    >>print(func(a))
absolute #絕對值
[[  2.5   3.1   7. ]
 [ 10.   11.   12. ]]

sqrt
[[        nan  1.76068169  2.64575131] #不知足運算法則的返回nan
 [ 3.16227766  3.31662479  3.46410162]]

exp
[[  8.20849986e-02   2.21979513e+01   1.09663316e+03]
 [  2.20264658e+04   5.98741417e+04   1.62754791e+05]]

log
[[        nan  1.13140211  1.94591015]
 [ 2.30258509  2.39789527  2.48490665]]

sign
[[-1.  1.  1.]
 [ 1.  1.  1.]]

ceil #向上取整
[[ -2.   4.   7.]
 [ 10.  11.  12.]]

modf #返回的爲一個元組=>(小數部分,整數部分)
(array([[-0.5,  0.1,  0. ],
       [ 0. ,  0. ,  0. ]]), array([[ -2.,   3.,   7.],
       [ 10.,  11.,  12.]]))

isnan
[[False False False]
 [False False False]]

cos
[[-0.80114362 -0.99913515  0.75390225]
 [-0.83907153  0.0044257   0.84385396]]

數組的index

一維數組

ndarray有着python原生數組的全部特性,例如切片(slice)code

a=np.arange(9)
>>a
 array([0, 1, 2, 3, 4, 5, 6, 7, 8])
>>a[2:5]
array([2, 3, 4])
>>a[2:-1]
array([2, 3, 4, 5, 6, 7])
>>a[:2]
 array([0, 1])
>>a[::-1]
 array([8, 7, 6, 5, 4, 3, 2, 1, 0])

固然還有原生數組沒有的特性htm

a[2:5]=-1
>>a
array([ 0,  1, -1, -1, -1,  5,  6,  7,  8])

有幾點須要注意的blog

  • 1.不能用如下方式增加或者縮減ndarray數組
try:
    a[2:5] = [1,2,3,4,5,6]  # too long
except ValueError as e:
    >>print(e)
cannot copy sequence with size 6 to array axis with dimension 3
  • 2.不能刪除ndarray數組元素 #原生數組能夠
try:
    del a[2:5]
except ValueError as e:
   >>print(e)
ValueError: cannot delete array elements
  • 3.修改切片數組的內容,原始數組值也發生變化
b = a[3:5]
b[0] = 999
>>b
array([999,   4])
>>a
array([  0,   1,   2, 999,   4,   5,   6,   7,   8])

若是肯定要拷貝數值,能夠使用copy方法element

b = a[3:5].copy()
b[0] = 999
>>a
array([0, 1, 2, 3, 4, 5, 6, 7, 8])
b
>>array([999,   4])

多維數組

多維的ndarray有許多神奇的方法

b = np.arange(24).reshape(4, 6)
>>b
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17],
       [18, 19, 20, 21, 22, 23]])
>>b[1,1] #等價與b[1][1]
7
>>b[1,:]#第一行的全部元素
array([ 6,  7,  8,  9, 10, 11])
>>b[:,1]#第一列的全部元素
array([ 1,  7, 13, 19])

注意:下面的兩種寫法的不一樣

>>b[1,:]
array([ 6,  7,  8,  9, 10, 11]) # (6L,)
>>b[1:2,:] 
array([[ 6,  7,  8,  9, 10, 11]])#(1L, 6L)

若是我只想要多維度數組中的第一行和最後一行/列呢?

>>b[(0,-1),:]
array([[ 0,  1,  2,  3,  4,  5],
       [18, 19, 20, 21, 22, 23]])

上面的寫法等價於

index = np.array([True,False,False,True])
>>b[index,:]
array([[ 0,  1,  2,  3,  4,  5],
       [18, 19, 20, 21, 22, 23]])

np.ix_

上面學習了那麼多的知識,咱們來要給小測驗:數組b中第1行和第3行中第4和第6列的元素([[3,5],[15,17]])該怎麼表示呢?
我猜你會這麼寫

>>b[(0,2),(3,5)]
array([ 3, 17]) 
>>b[[0,2],[3,5]]
array([ 3, 17])

上面的結果顯然不是咱們想要的,那麼正確的寫法是什麼呢?這時候就須要ix_方法

index = np.ix_([0,2],[3,5])
>>index
(array([[0],
        [2]]), array([[3, 5]]))
>>b[index]
array([[ 3,  5],
       [15, 17]])

ndarray的遍歷

對數組的遍歷是咱們常常用的操做,對於numpy數組該由如何遍歷呢?
接着使用上面的數組b,

for i in b:
    >>print 'row:',i
row: [0 1 2 3 4 5]
row: [ 6  7  8  9 10 11]
row: [12 13 14 15 16 17]
row: [18 19 20 21 22 23]

若是想要遍歷全部的元素呢

for i in b.flat:
    >>print 'Element:',i
Element: 0
Element: 1
Element: 2
....
Element: 21
Element: 22
Element: 23
相關文章
相關標籤/搜索