天天看點

numpy數組與矩陣運算numpy數組及其運算矩陣生成與常用操作

numpy數組及其運算

建立數組

import numpy as np
np.array([1,2,3,4,5]) #把清單轉換為數組
np.array((1,2,3,4,5)) #把元組轉化成數組
np.array(range(5))#把range對象轉換成數組
np.array([[1,2,3],[4,5,6]])#二維數組
np.arange(8) #類似于range函數
np.arange(1,10,2)  #等差數組,1到10,相鄰兩個數字之間相差2
np.linspace(0,10,11) #0到10的等差數組,包含11個數字
np.linspace(0,10,11,endpoint=False)#不包含終點
np.logspace(0,100,10) #相當于10**np.linspace(0,10,10)
np.logspace(1,6,5,base=2) #相當于2**np.linspace(1,6,5)
np.zeros(3)#全0一維數組
np.ones(3)# 全1一維數組
np.zeros((3,3))# 全0二維數組,3行3列
np.identity(3)#生成3行3列的機關矩陣
np.random.randint(0,50,5) #随機數組,5個0到50之間的數字
           

測試兩個數組元素是否接近

isclose傳回包含若幹True/False值的數組,而allclose傳回True或False值

import numpy as np
x=np.array([1,2,3,4.001,5])
y=np.array([1,1.999,3,4.01,5.1])
print(np.allclose(x,y))
print(np.allclose(x,y,rtol=0.2)) #設定相對誤差
print(np.allclose(x,y,atol=0.2)) #設定絕對誤差
print(np.isclose(x,y))
print(np.isclose(x,y,atol=0.2))
           

修改數組中元素的值

import numpy as np
x=np.arange(8)
np.append(x,8) #在尾部追加一個元素
np.append(x,[9,10]) #在尾部追加多個元素
x[3]=8 #使用下标形式修改數組
np.insert(x,1,7) #在位置1插入7,之後的元素以此向後移
y=np.array([[1,2,3],[4,5,6],[7,8,9]])
y[0,2]=4 #修改第0行第2列的元素值
y[1:,1:]=1 #切片,把行下标大于等于1,列下标也大于等于1的值都設定為1
m=np.array([[3,6,7],[8,9,6],[1,3,4]])
m[1:,1:]=[1,2] #同時修改多個元素值
print(m)
'''
[[3 6 7]
 [8 1 2]
 [1 1 2]]
 '''
m[1:,1:]=[[1,2],[3,4]]
print(m)
'''
[[3 6 7]
 [8 1 2]
 [1 3 4]]
'''
           

數組運算

import numpy as np
x=np.array([1,2,3,4,5,6])
print(x*2) #每個元素都乘以2,加減乘除及其幂運算等均為每個元素都要進行運算
np.array([1,2,3,4])+np.array([4,3,2,1])#等長數組相機,對應元素相加
np.array([2,3,4,5])+np.array([4])#每個元素加4
#等長數組之間的運算都是針對每一個元素進行運算
a=np.array([1,2,3])
a**a #相當于1的一次方,2的2次方,3的3次方
a=np.array([1,2,3])
b=np.array([[1,2,3],[4,5,6],[7,8,9]])
#不同次元的數組相乘,廣播
c=a*b #a中每個元素乘以b中對應列的元素
print(c)
'''
[[ 1  4  9]
 [ 4 10 18]
 [ 7 16 27]]
 '''
d=a+b
print(d)#a中每個元素加b中對應列元素
'''
[[ 2  4  6]
 [ 5  7  9]
 [ 8 10 12]]
'''
           

數組排序

import numpy as np
x=np.array([3,1,2])
np.argsort(x)#傳回排序後的元素下标[1,2,0],下标1的數最小,下标2次之,下标0最大
x.argmax()
x.argmin()#最大值,最小值下标
y=np.array([6,4,7,3,5])
y.sort()#原地排序
print(y)
# [3 4 5 6 7]
           

數組内積運算

兩個等長數組對應元素乘積之和

import numpy as np
x=np.array([1,2,3])
y=np.array([4,5,6])
print(np.dot(x,y))
print(x.dot(y))
print(sum(x*y))
           

通路數組中的元素

import numpy as np
x=np.array([[1,2,3],[4,5,6],[7,8,9]])
x[0] #第0行所有元素
x[0,2]#第0行2列,等價于x[0][2]
x[[0,2]]#第0行和第2行的所有元素
x[[0,2,1],[2,1,0]]#第一個[]内全部指行數,第二個指列數,即第0行第2列,第2行1列,第1行0列
y=np.arange(10)
print(y[::-1])#反向切片[9 8 7 6 5 4 3 2 1 0]
print(y[::2])#隔一個取一個元素[0 2 4 6 8]
print(y[:5])#前5個元素[0 1 2 3 4]
a=np.arange(25)
a.shape=5,5 #修改數組形狀
a[0,2:5] #第0行下标[2,5)的元素
a[2:5,2:5]#行标和列标都在[2,5)之間的元素
a[:,[2,4]]#第2列和第4列所有元素
a[[1,3]][:,[2,4]]# 第1,3行的第2,4列元素
           

矩陣生成與常用操作

矩陣隻能是二維的

生成矩陣

import numpy as np
x=np.matrix([[1,2,3],[4,5,6]])
y=np.matrix([1,2,3,4,5])
print(x,y,x[1,1],sep='\n\n')#x[1,1]與x[1][1]含義不同
           

矩陣轉置

import numpy as np
x=np.matrix([[1,2,3],[4,5,6]])
y=np.matrix([1,2,3,4,5])
print(x.T,y.T,sep='\n\n') #x.T,y.T表示轉置
           

檢視矩陣特征

import numpy as np
x=np.matrix([[1,2,3],[4,5,6]])
print(x.mean())#所有元素平均值
print(x.mean(axis=0))#縱向平均值
print(x.mean(axis=1))#橫向平均值
print(x.sum())#所有元素之後
print(x.max(axis=1))#橫向最大值
print(x.argmax(axis=1))#橫向最大值下标
print(x.diagonal())#對角線元素
print(x.nonzero())#非0元素下标,分别傳回行下标和列下标
           

計算方差,協方差,标準差

import numpy as np
print(np.cov([1,1,1,1,1,1]))#方差
print(np.std([1,1,1,1,1]))#标準差
x=[-2.1,-1,4.3]
y=[3,1.1,0.12]
X=np.vstack((x,y))#豎直堆疊矩陣
print(np.cov(X))#協方差
print(np.cov(x,y))#協方差
print(np.std(X))#标準差
print(np.std(X,axis=1))#标準差,橫着計算
           

計算特征值與特征向量

numpy數組與矩陣運算numpy數組及其運算矩陣生成與常用操作
import numpy as np
A=np.array([[1,-3,3],[3,-5,3],[6,-6,4]])
e,v=np.linalg.eig(A)
print(e,v,sep='\n')#e,v分别代表特征值和特征向量
print(np.dot(A,v))#矩陣與特征向量乘積
print(e*v)#特征值與特征向量乘積
print(np.isclose(np.dot(A,v),e*v))#驗證二者是否相等
           

計算逆矩陣

import numpy as np
x=np.matrix([[1,2,3],[4,5,6],[7,8,0]])
y=np.linalg.inv(x)#計算可逆矩陣的逆矩陣
print(y)
print(x*y)#乘積為機關矩陣
print(y*x)
           

求解線性方程組

numpy數組與矩陣運算numpy數組及其運算矩陣生成與常用操作
import numpy as np
a=np.array([[3,1],[1,2]])#系數矩陣
b=np.array([9,8])#等号右側列向量
x=np.linalg.solve(a,b)#求解
print(x)
print(np.dot(a,x))#驗證