Python基礎之數組和向量化計算總結
- 2020 年 1 月 16 日
- 筆記
一、多維數組
1、生成ndarray (array函數)
.np.array()生成多維數組
例如:import numpy as np data1=[6,7.5,8,0,1] #創建簡單的列表 print(data1) arr1=np.array(data1) #將列表創建數組 print(arr1)
2、ndarry的數據類型
(1)dtype() #獲取數組元素類型(浮點數、複數、整數等)
data=np.random.randn(2,3) #生成隨機數組 print(data) print(data.shape) #返回數組的形狀 print(data.dtype)
(2)轉化數組的數據類型:astype() astype生成一個新的數組
import numpy as np
a=np.array([0.11,2.2,3])
print(a)
b=a.astype(np.int)
print(b) 補充:python中type 獲取數據類型
3、numpy數組算術
(1)逐元素操作
arr=np.array([[1.,2.,3.],[4.,5.,6.]])
print(arr)
print(arr*arr)
4、索引與切片
(1)基礎索引與切片
arr=np.arange(10) print(arr) print(arr[5:8]) arr[5:8]=12 print(arr)
(2)布爾索引
names=np.array(["Bob","Joe","Will","Bob","Will","Joe","Joe",])
print(names=="Bob") #結果:[ True False False True False False False]
5、數組轉置與換軸
(1)arr.T #數組轉置
補充:簡單的一維和二維數組的轉置就是線性代數中的行列相互交換。而對於高維數組的轉置:
import numpy as np
a = np.arange(12).reshape(2, 2, 3)
#創建一個三維矩陣,由2個2*3的矩陣塊組成
print(a) #結果為:
[[[ 0 1 2] #運行結果:其中每個元素都有其唯一的坐標(x,y,z)例如:0的標為(0,0,0),1的坐標為:(0,1,0)……..11的坐標為(1,1,2)
[ 3 4 5]]
[[ 6 7 8]
[ 9 10 11]]]
Print(a.T) #Output為:數組變為了3個2*2的矩陣了。而各元素的坐標變為:0:(0,0,0),1:(1,0,0),……..11:(2,1,1)每個元素坐標的,其實該T操作等同於後面兩種方法a.transpose(2,1,0)中x軸和z軸的交換以及a.swapaxes(0,2)
[[[ 0 6]
[ 3 9]]
[[ 1 7]
[ 4 10]]
[[ 2 8]
[ 5 11]]]
(2)內積:np.dot() x.dot()等價於np.dot(x,y)
arr=np.random.randn(6,3) print(arr) print(arr.T) print(np.dot(arr.T,arr))
(3)換軸:transpose()
對於高維數組,transpose()方法的參數需要得到一個由軸編號(軸編號自0開始)序列構成的元組才能對軸進行轉置,只需要調換軸對應數字參數的順序就可以將數組進行軸的變換。
arr=np.arrange(16).reshape((2,2,6))
arr.transpose((1,0,2)) #將第二個軸和第一個軸變換位置
運行結果為:[[[ 0 1 2 3]
[ 8 9 10 11]]
[[ 4 5 6 7]
[12 13 14 15]]]
Swapaxes方法,直接進行軸的交換
二、函數
1、一元通用函數
(1)平方根 sqrt()
arr=np.arange(10) print(arr) print(np.sqrt(arr))
(2)自然指數值 exp()
print(np.exp(arr))
(3)返回數組的小數部分和整數部分 modf()
arr=np.random.randn(7)*5 print(arr) remainder,whole_part=np.modf(arr) print(remainder) print(whole_part)
2、二元通用函數
(1)最大值 maximum()
x=np.random.randn(8) print(x) y=np.random.randn(8) print(y) print(np.maximum(x,y))
3、矩陣分解的標準函數集 ???
(1)、numpy.linalg()
(1.1)、方陣的逆矩陣 inv()
(1.2)、QR分解 qr()
from numpy.linalg import inv,qr x=np.random.randn(5,5) print(x) mat=x.T.dot(x) #內積 print(inv(mat)) #求逆 q,r=qr(mat) print(r)
4、隨機數生成器
numpy.random()
注意:產生隨機數random.randn()和random.rand(n)的區別random.randn(n)是從標準正態分布中返回一個或者多個樣本值,random.rand(n,m)表示由位於(0,1)中的隨機數填充的n*m的矩陣。
三、數組編程
1、將條件邏輯作為數組操作 where()
xarr=np.array([1.1,1.2,1.3,1.4,1.5]) yarr=np.array([2.1,2.2,2.3,2.4,2.5]) cond=np.array([True,False,True,True,False]) #是否是x的值 result=np.where(cond,xarr,yarr) print(result) #result([1.1,2.2,1.3,1.4,2.5])
2、數學和統計方法 mean()平均值、sum()求和、cumsum()#從0元素來累計和、cumprod() # 從1元素來累計積 ???
arr=np.random.randn(5,4) print(arr) print(arr.mean()) #取總均值 print(np.mean(arr)) print(arr.mean(axis=1)) #按列數取均值 print(arr.mean(1))
3、布爾值數組的方法 any() all() ???
print(arr.sum(0)) #從0元素來是加總 arr=np.array([[0,1,2],[3,4,5],[6,7,8]]) print(arr) print(arr.cumsum(axis=0)) #axis=0行數加總 print(arr.cumprod(axis=1)) #axis=1列數加總 bools=np.array([False,False,True,False]) print(bools.any()) #至少有一個 print(bools.all()) #全部都是
4、計算唯一值並排序:unique()
ints=np.array([3,3,3,2,2,1,1,4,4]) print(np.unique(ints)) #唯一值 結果:[1 2 3 4]