1. 程式人生 > >1.Numpy數值計算基礎

1.Numpy數值計算基礎

筆記說明:本文是我的學習筆記,大部分內容整理自 黃紅梅,張良均等.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))