Numpy的基本用法
NumPy(Numerical Python) 是使用python進(jìn)行機(jī)器學(xué)習(xí)不可或缺的第三方庫,它支持?jǐn)?shù)組與矩陣運(yùn)算,此外也針對數(shù)組運(yùn)算提供大量的數(shù)學(xué)函數(shù)庫。ndarray對象是numpy中的基本對象之一,和python列表不同之處在于:python列表可以存放任何類型的元素,而ndarray對象則只能存放相同類型的元素。
?
python列表中的元素其實(shí)是一個指針,指向包含這個python對象所有信息的某個內(nèi)存位置。由于這里面包含了大量的額外信息,因此python可以自由、動態(tài)地編碼。但是這些額外信息也會成為負(fù)擔(dān)。當(dāng)python列表中的元素都是同一類型時,此時如果將數(shù)據(jù)存儲在固定類型的數(shù)組中會更高效。python的數(shù)組對象提供了數(shù)組型數(shù)據(jù)的有效存儲,而numpy則加上了高效的操作。
?
一. 導(dǎo)入numpy庫
import numpy as np?
二. 創(chuàng)建numpy數(shù)組(numpy array)
1. 從python列表創(chuàng)建(from python lists)
list=[4,5,6,7] array=np.array(list) [4 5 6 7]?
注意:當(dāng)使用乘號(*)時,python list做的是復(fù)制(replicate),而numpy array做的是乘法(multiply)。
print("list replication:", list*4) print("array multiplication:", array*4) list replication: [4, 5, 6, 7, 4, 5, 6, 7, 4, 5, 6, 7, 4, 5, 6, 7] array multiplication: [16 20 24 28]?
2.?從python元組創(chuàng)建(from python tuples)
tuple=(1,2,3,4) array=np.array(tuple) [1 2 3 4]?
3. np.arange([start,?]stop,?[step])
array=np.arange(7) [0 1 2 3 4 5 6] array=np.arange(7,12) [ 7 8 9 10 11] array=np.arange(7,12,2) [ 7 9 11]?
4. np.linspace(start,?stop,?num_of_elements,?endpoint=True)
array=np.linspace(5,15,9) [ 5. 6.25 7.5 8.75 10. 11.25 12.5 13.75 15. ]?
5. np.zeros(shape),np.ones(shape),np.full(shape, num)
array=np.zeros(5) [0. 0. 0. 0. 0.] array=np.ones((4,5)) [[1. 1. 1. 1. 1.][1. 1. 1. 1. 1.][1. 1. 1. 1. 1.][1. 1. 1. 1. 1.]] array=np.full((3,2),4.4) [[4.4 4.4][4.4 4.4][4.4 4.4]]?
6. np.asarray(data) --- 把數(shù)據(jù)轉(zhuǎn)變成numpy數(shù)組格式
?
7.?使用隨機(jī)數(shù)創(chuàng)建:具體請見下面隨機(jī)數(shù)
?
三. 查看numpy數(shù)組的屬性(attributes)
1. size ---?查看numpy array的元素個數(shù)
2. shape ---?查看numpy array的形狀(每個維度的大小)
3. ndim ---?查看numpy array的維度
4. dtype ---?查看numpy array的元素的數(shù)據(jù)類型
?
四.?視圖和拷貝(view©)
1. view() ---?僅復(fù)制值(a shallow copy: same location, same value, different shape)
2. copy() ---?產(chǎn)生獨(dú)立拷貝(deep copy: different location)
array=np.arange(12).reshape((3,4)) x=array[:2,::2].copy()?
五. 索引(Indexing)和切片(Slicing)
1. array[num] ---?對于一維數(shù)組,返回該數(shù)組的某個元素;對于多維數(shù)組,返回該數(shù)組的某一行
2. array[num:] ---?對于一維數(shù)組,返回該數(shù)組的某個元素以及其之后所有的元素;對于多維數(shù)組,返回該數(shù)組的某一行以及其之后的所有行
3. array[:num] ---?對于一維數(shù)組,返回該數(shù)組的某個元素之前的所有元素;對于多維數(shù)組,返回該數(shù)組的某一行之前的所有行
4. array[row_num, col_num] ---?對于多維數(shù)組,返回該數(shù)組某一行某一列的元素
5. array[row_num][col_num]?---?對于多維數(shù)組,返回該數(shù)組某一行某一列的元素
6. array[start:stop:step] ---?對于一維數(shù)組,返回該數(shù)組中從某一個元素到某一個元素,步長為step
7. array[::-1] ---?返回逆序的數(shù)組
8.?array[::2]?---?返回?cái)?shù)組中每隔一個元素的元素
9. array[row_num:row_num, col_num:col_num]?---?對于多維數(shù)組,返回該數(shù)組從某一行到某一行,以及從某一列到某一列的元素
?
注意:索引操作返回的是copy,而切片操作返回的是view(如果此view的數(shù)組的值發(fā)生改變,那么原數(shù)組的值也隨之改變)
?
五.?使用掩碼過濾((Mask Arrays)
1. array[mask]
一般在mask里寫一些條件,例如:array[array>0],array[array%7==0]。一些條件表示方法:&(和) ,|(或),^(異或),~(非),>(大于),<(小于),==(等于),>=(大于等于),<=(小于等于),!=(不等于)。
(注:and和or用于比較整個對象是否相同,而&和|用于比較每個對象中的內(nèi)容的比特位是否相同)
?
六.?廣播(Broadcassting)
用于操作不同大小和形狀的數(shù)組
a1=np.arange(4).reshape((2,2)) a2=np.array([6,7]) array=a1+a2 a1: [[0 1][2 3]] a2: [6 7] array: [[ 6 8][ 8 10]]?
七.?改變numpy數(shù)組的形狀
1. reshape(new_shape)
array=np.arange(6).reshape((2,3)) [[0 1 2][3 4 5]]?
2. ravel() ---?把原數(shù)組變成一維數(shù)組,返回的是變形后的數(shù)組
array=np.arange(6).reshape((2,3)).ravel() [0 1 2 3 4 5]?
3. flatten() ---?把原數(shù)組變成一維數(shù)組,返回的是數(shù)組的拷貝
?
4. flat ---?把原數(shù)組變成一維數(shù)組,返回的是數(shù)組的迭代器(iterator)
?
5. array[:, np.newaxis] ---?在原來的數(shù)組上增加一個維度(等價于array.reshape((-1,1)))
array=np.arange(4) x=array[:,np.newaxis] [[0][1][2][3]]?
八. 隨機(jī)數(shù)
1. np.random.randn(dimensions) ---?生成服從標(biāo)準(zhǔn)正態(tài)分布的隨機(jī)數(shù)(平均值為0,標(biāo)準(zhǔn)差為1)
array=np.random.randn(4,5) [[ 2.21603303 -1.64664239 2.45001994 -1.37329856 -0.69289112][-0.125158 -0.88744257 0.39569274 0.82625695 -1.08780716][ 0.69045662 -0.37110748 -1.23273598 0.0291697 -1.85835357][-0.02345338 0.10072476 0.3590989 -0.0499124 -0.46932103]]?
2. np.random.uniform(low,high,size) ---?生成服從均勻分布的隨機(jī)數(shù)
array=np.random.uniform(4,5,10) [4.98608384 4.70541334 4.50306141 4.44011335 4.21199919 4.329290914.94769774 4.75963238 4.86165138 4.39888279]?
3. np.random.binomial(n trials,p probability of success,size) ---?生成服從二項(xiàng)分布的隨機(jī)數(shù)
array=np.random.binomial(10,0.7,10) [6 8 9 7 4 7 6 8 9 8]?
4. np.random.normal(mean,std,size) ---?生成服從正態(tài)分布的隨機(jī)數(shù)
array=np.random.normal(2,4,(4,5)) [[-2.16965713 7.9465455 6.47141735 6.22990766 0.4211604 ][-6.09374231 6.55291348 3.72097759 1.97147291 -7.87745844][ 3.52418805 -9.37185049 5.6932117 0.35741766 1.5608389 ][ 3.98630581 0.30948976 -2.24940441 3.19326126 -8.51553261]]?
5. np.random.randint(low,high,size) ---?生成從low(inclusive)到high(exclusive)的隨機(jī)整數(shù)
array=np.random.randint(2,4,10) [3 3 2 2 2 2 2 2 3 3]?
6. np.random.rand(size) ---?生成[0,?1)區(qū)間內(nèi)的隨機(jī)數(shù)
array=np.random.rand(10) [0.06581389 0.65264403 0.97450565 0.08616934 0.55040952 0.698409240.40490815 0.12367222 0.88993262 0.77037247]?
7. np.random.choice(array) ---?從一維數(shù)組中生成隨機(jī)樣本
array=np.random.rand(10) num=np.random.choice(array) 0.95955024664668?
8. np.random.seed(num) ---?設(shè)置隨機(jī)數(shù)種子
?
9. np.random.RandomState(num) ---?設(shè)置隨機(jī)數(shù)種子,是隨機(jī)數(shù)種子的容器
rng=np.random.RandomState(4) array=rng.rand(10) [0.96702984 0.54723225 0.97268436 0.71481599 0.69772882 0.21608950.97627445 0.00623026 0.25298236 0.43479153]?
九. 數(shù)學(xué)運(yùn)算
1. +, -, *, / ---?加,減,乘,除
2. // ---?地板除法(取整)
3. % ---?模運(yùn)算(取余)
4. ** ---?指數(shù)運(yùn)算
5. np.abs() ---?返回絕對值
6. np.exp() ---?返回e的冪次方
7. np.sqrt() ---?返回平方根
8. np.log() ---?返回自然對數(shù)(以e為底)
9. np.log2() ---?返回以2為底對數(shù)
10. np.log10() ---?返回以10為底對數(shù)
11. np.sin() ---?返回正弦
12. np.cos() ---?返回余弦
13. np.std() ---?返回標(biāo)準(zhǔn)差
14. np.var() ---?返回方差
15. np.prod() ---?返回乘積
16. np.sum() ---?返回總和
17. np.mean() ---?返回平均值
18. np.min() ---?返回最小值
19. np.max() ---?返回最大值
20. np.median() ---?返回中位數(shù)
?
十. 合并numpy數(shù)組
1. np.concatenate((array1,array2,...), axis=0) ---?按行或列合并數(shù)組(數(shù)組在合并方向的維度需一致),axis=0表示按行合并,axis=1表示按列合并
a1=np.arange(4).reshape((2,2)) a2=np.array([[6,7]]) array=np.concatenate((a1,a2),axis=0) [[0 1][2 3][6 7]]?
2. np.stack((array1,array2,...), axis=0) ---?堆疊數(shù)組,增加一個維度
3. np.hstack((array1,array2,...)) ---?相當(dāng)于按列合并數(shù)組
4. np.vstack((array1,array2,...)) ---?相當(dāng)于按行合并數(shù)組
?
十一. 分隔numpy數(shù)組
1. np.split(array, n, axis=0) ---?按行或列將數(shù)組均勻分隔成n份,axis=0表示按行分隔,axis=1表示按列分隔
a1=np.array([[6,7],[8,9]]) array=np.split(a1,2) [array([[6, 7]]), array([[8, 9]])]?
2. np.hsplit(array, n) ---?相當(dāng)于按列分隔數(shù)組
3. np.vsplit(array, n) ---?相當(dāng)于按行分隔數(shù)組
?
十二. 線性代數(shù)相關(guān)(linear algebra)
1. np.mat(array) ---?將數(shù)組轉(zhuǎn)換成矩陣
2. np.dot(a,b) ---?對于一維數(shù)組(向量),計(jì)算這兩個數(shù)組的點(diǎn)積,對于多維數(shù)組(矩陣),運(yùn)行矩陣乘法
3. np.outer(a,b) ---?計(jì)算兩個向量的外積
4. np.eye(num) ---?創(chuàng)建一個num*num的單位矩陣(identity matrix)
5. np.linalg.solve(“Coefficient” matrix, y) ---?求解線性方程組
6. np.linalg.eig(matrix) ---?求矩陣的特征值,特征向量
7. np.linalg.lstsq(“Coefficient” matrix, y) ---?返回線性矩陣用最小二乘法獲得的解
8. np.linalg.det(matrix) ---矩陣求行列式
9. np.linalg.inv(matrix) ---?矩陣求逆
10. np.linalg.norm(array) ---?求范數(shù)
11. np.trace(array) ---?求矩陣的跡(對角線元素的和)
12. np.diag(matrix) ---?返回矩陣的對角線元素
13. np.linalg.svd(array) --- 奇異值分解
?
十三. 其他
1. np.argmax(array) ---?返回最大值的索引
2. np.argmin(array) ---?返回最小值的索引
3. np.any(array, axis=None) ---?測試數(shù)組(按行或按列)中的任意一個元素是否為真
4. np.all(array, axis=None) ---?測試數(shù)組(按行或按列)中的所有元素是否都為真
5. np.meshgrid(x,y) ---?生成網(wǎng)格點(diǎn)坐標(biāo)矩陣
x=np.arange(4) y=np.arange(4,7)X,Y=np.meshgrid(x,y) x: [0 1 2 3] y: [4 5 6] X: [[0 1 2 3][0 1 2 3][0 1 2 3]] Y: [[4 4 4 4][5 5 5 5][6 6 6 6]]X,Y = meshgrid(x,y) :將向量x和y定義的區(qū)域轉(zhuǎn)換成矩陣X和Y,其中矩陣X的行向量是向量x的簡單復(fù)制,而矩陣Y的列向量是向量y的簡單復(fù)制。假設(shè)x是長度為m的向量,y是長度為n的向量,則最終生成的矩陣X和Y的維度都是 n*m 。
?
6. astype(dtype) ---?轉(zhuǎn)換數(shù)據(jù)類型
7. np.where(condition, x, y) ---?如果滿足條件(condition),輸出x,不滿足則輸出y
8. np.count_nonzero(array) ---?統(tǒng)計(jì)數(shù)組中非零值的個數(shù)
9. np.sort(array) ---?返回排好序的數(shù)組,默認(rèn)的排序算法為快速排序
10. np.argsort(array) ---?返回原始數(shù)組排好序的索引值
11.?np.partition(array, k)?---?找出數(shù)組中第k小的值,輸出一個新數(shù)組,最左邊是第k小的值,往右是任意順序的其他值
12. np.argpartition(array, k) ---?找出數(shù)組中第k小的值的索引,輸出一個新數(shù)組,最左邊是第k小的值的索引,往右是任意順序的其他值的索引
13. np.percentitle(array, percentile, axis=None)?---?返回?cái)?shù)組百分比分位數(shù)
array=np.array([[6,7],[8,9]]) x=np.percentile(array,60,axis=0) [7.2 8.2]?
轉(zhuǎn)載于:https://www.cnblogs.com/HuZihu/p/10394880.html
總結(jié)
以上是生活随笔為你收集整理的Numpy的基本用法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php协议任意文件读取
- 下一篇: 解决ubuntu修改密码 Module