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[2
]
for
k
in
x]
結果為:[2, 7] ,對於
[k[2
]
for
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)