1.Numpy數值計算基礎
阿新 • • 發佈:2019-01-14
筆記說明:本文是我的學習筆記,大部分內容整理自 黃紅梅,張良均等.Python資料分析與應用[M].北京:人民郵電出版社,2018,21-49. 還有部分片斷知識來自網路搜尋補充。
一個目錄
1.陣列物件ndarray
1.1建立陣列型別
1.1.1陣列屬性
- ndim:返回int,表示陣列的維度。
- shape:返回tuple,表示陣列的尺寸,比如n行m列的矩陣,表示為(n,m)。
- size:返回int,表示陣列的元素總數,等於陣列形狀的乘積。
- dtype:返回data-type你描述陣列中的元素型別。
- itemsize:返回int,表示陣列的每個元素的大小(位元組為單位)。
1.1.2陣列建立
numpy.array(object,dtype=None ,ndmin=None)
import numpy as np
arr1=np.array([[1,2,3,4],[4,5,6,7]])
print(arr1)
arr1.shape=4,2 ##不是轉置,只是改變排列,陣列順序不變,看結果!很直觀
print(arr1)
##一些內建函式建立陣列
np.arange(0,7.5,0.5) ## 等差為0.5
np.linspace(0,7,8) ## [0,7]區間生成8個元素的等差數列
np.logspace(0,1,3) ##[10^0,10^1]區間生成3各元素的等比數列
np.zeros((2,3)) ##生成(2,3)的0陣列
np.eye(3) ##生成主對角線為1的類似單位矩陣的陣列
np.diag([1,2,3,4]) ##主對角陣列
np.ones((5,3)) ##生成全為1的陣列
1.2生成隨機數
import numpy as np
np.random函式具有以下模組:
- random(100):0~1之間的額100個隨機數
- rand(2,3):均勻分佈的隨機數
- randn():標準正態分佈
- randint(low,high,size):整數範圍的隨機數
- binomial:二項分佈
- normal(loc=“均值”,scale=“方差”,size):正態分佈
- Shuffle:對一個序列隨機排序
- choice(a,size,p):對a按照概率(權重)為p進行隨機選取尺寸為size的的資料
- beta:貝塔分佈
- chisquare:卡方分佈
- gamma:伽馬分佈
- sample:簡單隨機抽樣
- seed:設定隨機種子
- RandomState:隨機數種子
- 相同處: 他們的引數都是隨機數seed不同處: numpy.random.RandomState()更為複雜,完全可以代替numpy.random.seed()這條語句。
隨機數種子seed只有一次有效,在下一次呼叫產生隨機數函式前沒有設定seed,則還是產生隨機數。
但是RandomState不是這樣的,由於使用方式不同,直接限制會產生同樣的隨機數。
## 上個栗子!
from numpy.random import RandomState
rdm = RandomState(123)
a = rdm.randint(1, 10,7)
rdm = RandomState(123)
b = rdm.randint(1, 10, 7)
print (a,'\n', b)
a==b
1.3索引訪問陣列
1.3.1一維陣列的索引
arr=np.arange(10)
arr
arr[5]
arr[2:3]
arr[1:7:2] ## step=2
arr[2:4]=77,99 ## 直接修改元素
1.3.2多維陣列的索引
- 就是切片的方式索引
rdm=np.random.RandomState(5)
arr=rdm.randint(0,100,[3,5])
print(arr[:,2:5]) ##使用索引訪問
print(arr[(1,4),(0,2,3)]) ##下表索引
1.4變換陣列的形態
1.4.1 改變陣列形狀
rdm=np.random.RandomState(5)
arr=rdm.randint(0,100,[3,5])
arr.shape=5,3
arr
arr3=arr.reshape(3,5)
arr3
1.4.2使用ravel/flatten展平陣列
arr4=arr3.ravel()
arr4
arr5=arr3.flatten() ##預設是橫向展平
arr6=arr3.flatten('F') ###縱向展平
1.4.3組合
### hstack橫向組合
rdm=np.random.RandomState(5)
arr1=rdm.randint(0,100,[3,5])
arr2=arr1*3
arr3=np.hstack(arr1,arr2)
arr3
### vstack縱向組合
arr4=np.vstack(arr1,arr2)
### concatenate函式組合,axis=1橫向組合,axis=0縱向組合
arr5=np.concatenate((arr1,arr2),axis=1)
1.4.4分割陣列
## hsplit橫向切分,橫向的意思是保持行不變,拆列
rdm=np.random.RandomState(5)
arr1=rdm.randint(0,100,[3,5])
arr2=np.hsplit(arr1,2)
arr2
## vsplit
arr3=np.vsplit(arr1,2)
arr3
## split,axis=1是橫向切分,axis=0是縱向切分
arr4=np.split(arr1,a)==arr2
arr4
2.Numpy矩陣與通用函式
2.1建立Numpy矩陣
2.1.1 mat/matrix
import numpy as np
matr1 = np.mat("1 2 3;4 5 6;7 8 9")
print(matr1)
matr2 = np.matrix([[1,2,3],[4,5,6],[7,8,9]])
print(matr2)
2.1.2 bmat
arr1=np.eye(3)
arr2=arr1*3
print(np.bmat("arr1 arr2;arr1 arr2"))
2.1.3矩陣的屬性
- matrix.multiply:對應元素的相乘
- matrix.T:轉置
- matrix.H:共軛轉置
- matrix.I:逆矩陣
- matrix.A:返回自身資料的二維陣列的一個試圖(沒有做任何複製)
dir(matrix)
## matr3不可逆
import numpy as np
matr1 = np.mat("1 2 3;4 5 6;7 8 9")
matr3=matr1*3
matr3*matr3.I
這裡有個問題就是對於一個不可逆矩陣matr3,但是求出了它的逆矩陣,乘積不為單位陣,
初步認為是精度問題,這個怎麼判斷或者回避這個問題
是精度問題,numpy以二進位制讀取資料會出現精度問題,可以使用np.set_printoptions(precision=3,suppress=True)來確定陣列元素的小數位數和關閉浮點數的科學計數法表示
2.2掌握 ufunc 函式
這個廣播機制沒看懂
3.利用Numpy進行統計分析
3.1 利用numpy讀取資料或者儲存
save
savetet
loadtet
3.2 簡單的描述性統計分析
3.2.1 sort/argsort/lexsort排序
rdm=np.random.RandomState(123)
arr=rdm.randint(1,10,size=10);arr
arr.sort;arr
arr1=rdm.randint(1,10,size=(3,3));arr1
arr1.sort(axis=1);arr1 #按橫軸排序
arr1.sort(axis=0);arr1 #按縱軸排序、
argsort返回下標
lexsort幹啥了?????看不懂
3.2.2 去重(np.unique)與重複資料(np.tile/np.repeat)
# 建立一個一維陣列
ints=np.array([1,2,3,4,5,6,7,8,7,9,7,8,7,8,7,7,7,7,])
print('去重之後:',np.unique(ints))
print('去重之後:',sorted(set(ints)))
print('去重之後:',np.tile(ints,2)) # tile(A,reps),重複次數是reps
#repeat(a,repeats,axis=None)
rdm=np,random.RandomState(123)
arr=rdm.randint(0,10,size=(3,3)
arr
print(arr.repeat(2,axis=1)) #對元素重複,axis=1,橫向排序,對列進行重複操作
print(np.tile(arr,2)) #對陣列重複,沒有axis這個引數,只能橫向排序
3.2.3常用的統計函式
sum/mean/std/var/min/max
預設情況下axis=None,會計算一個總值
arr=np.arange(20).reshape(4,5)
arr
np.set_printoptions(precision=4,suppress=True)
print(np.sum(arr))
print(np.sum(arr,axis=0))
print(np.mean(arr))
print(round(np.std(arr),4))
print(np.argmax(arr))