1. 程式人生 > >Python---numpy一般操作

Python---numpy一般操作

轉自:https://blog.csdn.net/gn102038/article/details/71439184

import  numpy as np

 

1.建立矩陣

1.1一般矩陣的建立

a1=np.array([1,2,3],dtype=int)  #建立一個[1,2,3]的一維陣列,資料型別是int。也可以不指定資料型別,使用預設。幾乎所有的陣列建立函式都可以指定資料型別,即dtype的取值。

a2=np.array([[1,2,3],[2,3,4]])  #建立一個二維陣列。此處和MATLAB的二維陣列(矩陣)的建立有很大差別。

同樣,numpy中也有很多內建的特殊矩陣:

a3=np.array([[[1,2,3],[2,3,4]],[[3,4,5],[4,5,6]]])#注意一層[]代表一維,該有三層

 

1.2一些特殊的矩陣

b1=np.zeros((2,3))   #生成一個2行3列的全0矩陣。注意,引數是一個tuple:(2,3),所以有兩個括號。完整的形式為:          zeros(shape,dtype=)。相同的結構,有ones()建立全1矩陣。empty()建立一個空矩陣,使用記憶體中的隨機值來填充這個矩陣。

b2=np.identity(n)   #建立n*n的單位陣,這隻能是一個方陣。

b3=eye(N,M=None,k=0)   #建立一個對角線是1其餘值為0的矩陣,用k指定對角線的位置。M預設None。

numpy.eye(N,M=None, k=0, dtype=<type 'float'>)

關注第一個第三個引數就行了

第一個引數:輸出方陣(行數=列數)的規模,即行數或列數

第三個引數:預設情況下輸出的是對角線全“1”,其餘全“0”的方陣,如果k為正整數,則在右上方第k條對角線全“1”其餘全“0”,k為負整數則在左下方第k條對角線全“1”其餘全“0”。

此外,numpy中還提供了幾個like函式,即按照某一個已知的陣列的規模(幾行幾列)建立同樣規模的特殊陣列。這樣的函式有

np.zeros_like()、np.empty_like()、np.ones_like(),它們的引數均為如此形式:zeros_like(a,dtype=),其中,a是一個已知的陣列。

 

c1=np.arange(2,3,0.1)  #起點,終點,步長值。含起點值,不含終點值。

c2=np.linspace(1,4,10)   #起點,終點,區間內點數。起點終點均包括在內。同理,有logspace()函式

d1=np.linalg.companion(a)   #伴隨矩陣

d2=np.linalg.triu()/tril()  #作用同MATLAB中的同名函式

 

e1=np.random.rand(3,2)   #產生一個3行2列的隨機陣列。同一空間下,有randn()/randint()等多個隨機函式

fliplr()/flipud()/rot90()   #功能類似MATLAB同名函式。

xx=np.roll(x,2)  #roll()是迴圈移位函式。此呼叫表示向右迴圈移動2位。

2.陣列的特徵資訊

先假設已經存在一個N維陣列X了,那麼可以得到X的一些屬性,這些屬性可以在輸入X和一個.之後,按tab鍵檢視提示。這裡明顯看到了Python面向物件的特徵。

X.flags    #陣列的儲存情況資訊。

X.shape   #結果是一個tuple,返回本陣列的行數、列數、……,三維的是(C,H,W)

X.ndim   #陣列的維數,結果是一個數

X.size    #陣列中元素的數量

X.itemsize   #陣列中的資料項的所佔記憶體空間大小

X.dtype    #資料型別

X.T   #如果X是矩陣,發揮的是X的轉置矩陣

X.trace()    #計算X的跡

np.linalg.det(a)   #返回的是矩陣a的行列式

np.linalg.norm(a,ord=None)   #計算矩陣a的範數

np.linalg.eig(a)   #矩陣a的特徵值和特徵向量

np.linalg.cond(a,p=None)   #矩陣a的條件數

np.linalg.inv(a)   #矩陣a的逆矩陣

3.矩陣分解

常見的矩陣分解函式,numpy.linalg均已經提供。比如cholesky()/qr()/svd()/lu()/schur()等。某些演算法為了方便計算或者針對不同的特殊情況,還給出了多種呼叫形式,以便得到最佳結果。

4.矩陣運算

np.dot(a,b)用來計算陣列的點積;vdot(a,b)專門計算向量的點積,和dot()的區別在於對complex資料型別的處理不一樣;innner(a,b)用來計算內積;outer(a,b)計算外積。

專門處理矩陣的數學函式在numpy的子包linalg中定義。比如np.linalg.logm(A)計算矩陣A的對數。可見,這個處理和MATLAB是類似的,使用一個m字尾表示是矩陣的運算。在這個空間內可以使用的有cosm()/sinm()/signm()/sqrtm()等。其中常規exp()對應有三種矩陣形式:expm()使用Pade近似演算法、expm2()使用特徵值分析演算法、expm3()使用泰勒級數演算法。在numpy中,也有一個計算矩陣的函式:funm(A,func)。

5.索引

numpy中的陣列索引形式和Python是一致的。如:

5.1 一維索引

x=np.arange(10)

print x[2]   #單個元素,從前往後正向索引。注意下標是從0開始的。

print x[-2]   #從後往前索引。最後一個元素的下標是-1

print x[2:5]   #多個元素,左閉右開,預設步長值是1

print x[:-7]   #多個元素,從後向前,制定了結束的位置,使用預設步長值,該結果為[0 1 2]

print x[1:7:2]   #指定步長值 結果為:[1 3 5]

5.2 二維索引(H,W)

x.shape=(2,5)   #x的shape屬性被重新賦值,要求就是元素個數不變。2*5=10

       結果:   x= array([[0, 1, 2, 3, 4],
                                      [5, 6, 7, 8, 9]])

 

提取個某元素

print x[1,3]   #二維陣列索引單個元素,第2行第4列的那個元素,結果為8

提取某行

法一:print x[0]   #第一行所有的元素,同理print x[1],第二行所有元素 

法二:print x[0,:] #第一行所有元素,即x[0]==x[0,:]  結果都為[0,1,2,3,4]

提取某列

法一:

>>> l = [k[2for k in x]

 

結果為:[2, 7] ,對於[k[2for k in x]中的k第一次k==[0 1 2 3 4],k[2]==2。第二次k==[5 6 7 8 9],k[2]==7

 

法二:

 

x[:,2],結果和上面一樣的

 

5.2 三維索引(C,H,W)

>>> a3=np.array([[[1,2,3],[2,3,4]],[[3,4,5],[4,5,6]]])
>>> a3
array([[[1, 2, 3],
        [2, 3, 4]],


       [[3, 4, 5],
        [4, 5, 6]]])

 

>>> a3[1,:,:]   獲得通道二的矩陣
array([[3, 4, 5],
       [4, 5, 6]])

 

 

y=np.arange(35).reshape(5,7)   #reshape()函式用於改變陣列的維度

                   y=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, 24, 25, 26, 27],
                                   [28, 29, 30, 31, 32, 33, 34]])

print y[1:5:2,::2]   #選擇二維陣列中的某些符合條件的元素

          結果:[[ 7  9 11 13]
                     [21 23 25 27]]

 

6.連結串列推導式

>>> freshfruit = ['  banana', '  loganberry ', 'passion fruit  ']
>>> [weapon.strip() for weapon in freshfruit]
['banana', 'loganberry', 'passion fruit']
>>> vec = [2, 4, 6]
>>> [3*x for x in vec]
[6, 12, 18]
>>> [3*x for x in vec if x > 3]
[12, 18]
>>> [3*x for x in vec if x < 2]
[]
>>> [[x,x**2] for x in vec]
[[2, 4], [4, 16], [6, 36]]
>>> [x, x**2 for x in vec]      # error - parens required for tuples
  File "<stdin>", line 1, in ?
    [x, x**2 for x in vec]
               ^
SyntaxError: invalid syntax
>>> [(x, x**2) for x in vec]
[(2, 4), (4, 16), (6, 36)]
>>> vec1 = [2, 4, 6]
>>> vec2 = [4, 3, -9]
>>> [x*y for x in vec1 for y in vec2]
[8, 6, -18, 16, 12, -36, 24, 18, -54]
>>> [x+y for x in vec1 for y in vec2]
[6, 5, -7, 8, 7, -5, 10, 9, -3]
>>> [vec1[i]*vec2[i] for i in range(len(vec1))]
[8, 12, -54]
為使連結串列推導式匹配for迴圈的行為,可以在推導之外保留迴圈變數:

>>> x = 100                     # this gets overwritten
>>> [x**3 for x in range(5)]
[0, 1, 8, 27, 64]
>>> x                           # the final value for range(5)