最近給大家更新一波python的基礎(chǔ)知識(shí),這次帶來(lái)的是手撕numpy系列,。 numpy是"Numerical Python"的簡(jiǎn)稱(chēng),。numpy提供了一個(gè)高性能的多維數(shù)組對(duì)象ndarray(N Dimension Array),以及大量的庫(kù)函數(shù)和操作,,可以幫助程序員輕松地進(jìn)行數(shù)值計(jì)算。原生python語(yǔ)言執(zhí)行速度很慢,,C執(zhí)行500次,,python差不多只能執(zhí)行一次,但是python語(yǔ)法比其它編程語(yǔ)言要簡(jiǎn)單的多得多,。因此我們既想要某一個(gè)編程語(yǔ)言執(zhí)行速快,,同時(shí)還編程簡(jiǎn)單,。最終python通過(guò)集成C和C++,最終解決這個(gè)問(wèn)題,,也就是說(shuō):底層運(yùn)行的是C和C++的代碼,,但是上層使用的是python語(yǔ)言去寫(xiě)的。這就是我們?yōu)槭裁炊枷矚g使用"numpy庫(kù)"的原因,。numpy作為很多的用來(lái)做數(shù)據(jù)挖掘,,數(shù)據(jù)分析,人工智能相關(guān)的技術(shù)組件的底層實(shí)現(xiàn),。像SciPy,、Matplotlib、Scikit-learn在一定程度上,,都需要依賴(lài)numpy,。學(xué)習(xí)怎么使用numpy組織數(shù)據(jù)(怎么創(chuàng)建出,,你想要的不同維度,,不同形狀的數(shù)組):numpy提供了一個(gè)高性能的多維數(shù)組對(duì)象:ndarray。學(xué)習(xí)numpy提供的函數(shù)處理這個(gè)組好的數(shù)據(jù):numpy提供了很多很多的庫(kù)函數(shù),,幫助我們處理這些數(shù)據(jù),。3、關(guān)于numpy中ndarray數(shù)據(jù)對(duì)象的結(jié)構(gòu)說(shuō)明numpy中最重要的數(shù)據(jù)結(jié)構(gòu)是稱(chēng)為ndarray的n維數(shù)組對(duì)象,,這個(gè)對(duì)象由兩部分構(gòu)成:- 元數(shù)據(jù)部分:存儲(chǔ)的是當(dāng)前這個(gè)ndarray對(duì)象的一些描述信息,;
- 真實(shí)數(shù)據(jù)部分:存儲(chǔ)的是當(dāng)前這個(gè)ndarray對(duì)象中的真實(shí)數(shù)據(jù)。
1)什么是ndarray數(shù)組對(duì)象的描述信息呢,?注意:上述圖中的shape,、size、dtype,、ndim等都是x這個(gè)ndarray對(duì)象的描述信息,,這些信息都存儲(chǔ)在元數(shù)據(jù)區(qū)域。而1,,2,,3,4,,5,,6就是這個(gè)對(duì)象中的真實(shí)數(shù)據(jù)。4,、ndarray數(shù)組和list列表的簡(jiǎn)單對(duì)比① ndarray數(shù)組和list中的數(shù)據(jù)類(lèi)型list列表中可以存儲(chǔ)不同的數(shù)據(jù)類(lèi)型,,例如:x = [1,2.3,True,“中國(guó)”],。ndarray數(shù)組中存儲(chǔ)的所有的元素的類(lèi)型,,都必須一致,。② 使用numpy創(chuàng)建數(shù)組和使用原生list的效率對(duì)比③ 使用ndarray創(chuàng)建數(shù)組的好處既然ndarray中,每個(gè)元素的類(lèi)型既然是一致的,,那么整個(gè)ndaray就只需要一個(gè)元數(shù)據(jù)信息就可以了,,而不是像list一樣,每個(gè)對(duì)象都需要存儲(chǔ)一個(gè)元數(shù)據(jù)信息,。ndarray好處在于:1,、由于元數(shù)據(jù)只需要存儲(chǔ)一份,所以可以更節(jié)省空間,。2,、由于每個(gè)元素的類(lèi)型一致,就證明每個(gè)元素占用內(nèi)存的大小是一致的,,那么這樣的數(shù)據(jù)的存儲(chǔ)可以更緊湊,,操作更高效。① 用一個(gè)例子進(jìn)行說(shuō)明② 一張圖形象說(shuō)明一維數(shù)組、二維數(shù)組,、三維數(shù)組的ndarray寫(xiě)法③ 針對(duì)上述知識(shí)點(diǎn)進(jìn)行舉例說(shuō)明6,、創(chuàng)建數(shù)組的幾種不同方式1)利用array()函數(shù)去創(chuàng)建數(shù)組;import numpy as np
array1 = [1,2,3] m = np.array(array1) display(m)
array2 = [[1,2,3],[4,5,6]] n = np.array(array2) display(n)
- np.array(參數(shù))函數(shù),,參數(shù)給了什么樣式的數(shù)據(jù),,就構(gòu)建什么樣式的ndarray數(shù)組;你給我一個(gè)一維列表,,我就構(gòu)建一個(gè)一維數(shù)組,;你給我一個(gè)二維列表,我就構(gòu)建一個(gè)二維數(shù)組,;
- 什么是二維列表,?每個(gè)元素都是一個(gè)一維列表的列表,就是一個(gè)二維列表,;
- 如果我構(gòu)建了一個(gè)二維列表,,那么這個(gè)二維列表中的每個(gè)元素就都是一個(gè)一維列表;
- 在numpy中,,一維數(shù)組又叫做"向量",;二維數(shù)組又叫做"矩陣";
2)利用arange()函數(shù)去創(chuàng)建數(shù)組:對(duì)比列表的range()函數(shù)學(xué)習(xí),;# 語(yǔ)法如下: range(start,end,step) arange(start,end,step) # 舉例如下: list1 = list(range(1,10,2)) display(list1) array1 = np.arange(1,10,2) display(array1)
② 不同點(diǎn):arange()函數(shù)的步長(zhǎng),,可以是浮點(diǎn)數(shù),但是range()函數(shù)的步長(zhǎng),不能是浮點(diǎn)數(shù)list1 = list(range(1,10,2)) display(list1) list2 = list(range(1,10,0.5)) display(list2) list3 = list(range(10,1,-2)) display(list3)
array1 = np.arange(1,10,2) display(array1) array2 = np.arange(1,10,0.5) display(array2) array3 = np.arange(10,1,-2) display(array4)
- np.zeros((x,y)):生成一個(gè)x行y列的,元素都是0的二維數(shù)組,;
- np.ones((x,y)):生成一個(gè)x行y列的,,元素都是1的二維數(shù)組;
- np.full((x,y),value):生成一個(gè)x行y列的,,元素都是value的二維數(shù)組,,其中這個(gè)value值可以是整數(shù)(正整數(shù),0,負(fù)整數(shù))或者小數(shù);
array1 = np.zeros((3,4)) display(array1)
array2 = np.ones((3,4)) display(array2)
array1 = np.full((3,4),1.2) display(array3)
注意:我這里以創(chuàng)建二維數(shù)組為例,,你傳入一個(gè)數(shù)字,,就可以創(chuàng)建一維數(shù)組;你傳入三個(gè)數(shù)字,,就可以創(chuàng)建三維數(shù)組,,可以自己下去試一試。4)按照已有的ndarray數(shù)組的形狀,,創(chuàng)建形狀相同但指定元素的ndarray數(shù)組,;## 1)先創(chuàng)建一個(gè)一維數(shù)組和一個(gè)二維數(shù)組; n1 = np.array([1,2,3]); n2 = np.array([[1,2,3],[4,5,6]])
## 2)使用np.zeros_like() array1 = np.zeros_like(n1) array2 = np.zeros_like(n2) display(array1) display(array2)
## 3)np.ones_like() array3 = np.ones_like(n1) array4 = np.ones_like(n2) display(array3) display(array4)
## 4)np.full_like() array5 = np.full_like(n1) array6 = np.full_like(n2) display(array5) display(array6)
5)創(chuàng)建單位矩陣和對(duì)角矩陣,;## 1)np.eye(x)和np.identity(x) array1 = np.eye(3) display(array1)
array2 = np.identity(4) display(array2)
## 1)np.diag() array1 = np.diag([10,20,30]) display(array1)
6)創(chuàng)建等差數(shù)列數(shù)組:對(duì)比arange()函數(shù)和linspace()函數(shù)學(xué)習(xí),;① np.arange()和np.linspace()創(chuàng)建等差數(shù)列的區(qū)別- np.arange(start,stop,step)第三個(gè)參數(shù)指的是元素步長(zhǎng);
- np.linspace(start,stop,num)第三個(gè)參數(shù)指的是元素個(gè)數(shù),;
- np.arange()取不到最大的那個(gè)值stop,,np.linspace()默認(rèn)可以取到最大值stop;
array1 = np.arange(1,15,3) display(array1) display(array1.dtype)
array2 = np.linspace(1,15,3) display(array2) display(array2.dtype)
③ np.linspace()中兩個(gè)常用的參數(shù):endpoint和dtype- endpoint=True表示是包含終止值(默認(rèn)),,endpoint=False表示不包含終止值,;
- dtype=np.float64指定創(chuàng)建的數(shù)組的數(shù)據(jù)類(lèi)型默認(rèn)是float64,你也可以設(shè)置為dtype=np.np.int32,;
array3 = np.linspace(1,20,num=5,endpoint=False,dtype=np.float64) display(array3)
array4 = np.linspace(1,20,num=5,endpoint=False,dtype=np.int32) display(array4)
array5 = np.linspace(1,20,num=5,endpoint=True,dtype=np.float64) display(array5)
array6 = np.linspace(1,20,num=5,endpoint=True,dtype=np.int32) display(array6)
7)創(chuàng)建等比數(shù)列數(shù)組,;① 用一個(gè)例子進(jìn)行說(shuō)明log_array = np.logspace(1, 7, num=4, endpoint=True, base=2) display(log_array)
注意:上述代碼表示在2的一次方到2的七次方之間,生成4個(gè)數(shù),,這四個(gè)數(shù)字還構(gòu)成了一個(gè)等比數(shù)列,。log_array1 = np.logspace(1, 5, 3) display(log_array1)
注意:上述代碼表示會(huì)默認(rèn)base=10,也就是說(shuō),,在10的一次方到10的五次方之間,,生成3個(gè)數(shù),這3個(gè)數(shù)還構(gòu)成一個(gè)等比數(shù)列,。8)通過(guò)自定義函數(shù)創(chuàng)建數(shù)組,;## 1)np.fromfunction() ## 定義一個(gè)函數(shù) def f(x, y): return x * 2 + 1 + y
## 從一個(gè)函數(shù)生成一個(gè)二維數(shù)組; b = np.fromfunction(f, (3,3), dtype=np.int32) display(b)
## 在這個(gè)函數(shù),f函數(shù)要接收的參數(shù),,就是當(dāng)前元素的坐標(biāo),; ## 0行0列,傳入的就是x=0,y=0; ## 0行1列,,傳入的就是x=0,y=1; ## 3行2列,,傳入的就是x=3,y=2;
在看點(diǎn)這里好文分享給更多人↓↓
|