【入门基础】Numpy基础20问
1、什么是numpy?
一言以蔽之,numpy是python中基于數(shù)組對象的科學(xué)計算庫。
提煉關(guān)鍵字,可以得出numpy以下三大特點:
擁有n維數(shù)組對象;
擁有廣播功能(后面講到);
擁有各種科學(xué)計算API,任你調(diào)用;
2、如何安裝numpy?
因為numpy是一個python庫,所以使用python包管理工具pip或者conda都可以安裝。
安裝python后,打開cmd命令行,輸入:
pip install numpy即可完成安裝。
3、什么是n維數(shù)組對象?
n維數(shù)組(ndarray)對象,是一系列同類數(shù)據(jù)的集合,可以進行索引、切片、迭代操作。
numpy中可以使用array函數(shù)創(chuàng)建數(shù)組:
import?numpy?as?np np.array([1,2,3]) #?輸出:array([1, 2, 3])4、如何區(qū)分一維、二維、多維?
判斷一個數(shù)組是幾維,主要是看它有幾個軸(axis)。
一個軸表示一維數(shù)組,兩個軸表示二維數(shù)組,以此類推。
每個軸都代表一個一維數(shù)組。
比如說,二維數(shù)組第一個軸里的每個元素都是一個一維數(shù)組,也就是第二個軸。
一維數(shù)組一個軸:
[1,2,3]二維數(shù)組兩個軸:
[[0, 1, 2],[3, 4, 5]]三維數(shù)組三個軸:
[[[ 0, 1, 2],[ 3, 4, 5]],[[ 6, 7, 8],[ 9, 10, 11]]]以此類推n維數(shù)組。
5、如何創(chuàng)建n維數(shù)組?
numpy中常用array函數(shù)創(chuàng)建數(shù)組,傳入列表或元組即可。
創(chuàng)建一維數(shù)組,并指定數(shù)組類型為int:
import?numpy?as?np np.array([1,2,3],dtype=int) #?輸出:array([1, 2, 3])創(chuàng)建二維數(shù)組:
import?numpy?as?np np.array(((1,2),(3,4)))''' 輸出: array([[1,?2],[3,?4]]) '''還可以使用arange函數(shù)創(chuàng)建一維數(shù)字?jǐn)?shù)組,用法類似python的range函數(shù).
import?numpy?as?np np.arange(1,6) ''' 輸出:array([1, 2, 3, 4, 5]) '''6、如何創(chuàng)建隨機數(shù)組?
numpy的random模塊用來創(chuàng)建隨機數(shù)組。
random.rand函數(shù),生成[0,1)均勻分布的隨機數(shù)組
random.randn函數(shù),生成數(shù)值成標(biāo)準(zhǔn)正態(tài)分布(平均值為0,標(biāo)準(zhǔn)差為1)的數(shù)組
random.randint函數(shù),生成可以指定范圍的隨機整數(shù)數(shù)組
random.normal函數(shù),生成數(shù)值成正態(tài)分布(可指定平均值、標(biāo)準(zhǔn)差)的數(shù)組
random模塊還有其他函數(shù),這里不多說。
7、如何查看數(shù)組的維度?
前面說到,數(shù)組維度即代表軸的數(shù)量。
我們可以通過數(shù)組(ndarray)對象的ndim或shape屬性,來查看軸的數(shù)量。
ndim屬性直接返回維度值;
shape屬性返回一個元組,元組的長度即代表維度值,里面的數(shù)字從左往右分別代表每一軸的元素數(shù)量。
8、如何查看數(shù)組有多少個元素?
數(shù)組(ndarray)對象的size屬性可以查看數(shù)組包含元素總數(shù)。
import?numpy?as?np #?創(chuàng)建二維數(shù)組 x2?=?np.array([[1,2,3],[4,5,6]]) #?查看元素總數(shù) x2.size ''' 輸出:6 '''還可以通過shape屬性返回元素的乘積,來計算數(shù)組元素數(shù)量。
import?numpy?as?np from?functools?import?reduce #?創(chuàng)建二維數(shù)組 x2?=?np.array([[1,2,3],[4,5,6]]) #?查看元素總數(shù) reduce(lambda?x,y:x*y?,?x2.shape) ''' 輸出:6 shape形狀: (2,3) '''9、Numpy數(shù)組支持哪些數(shù)據(jù)類型?
Numpy支持的數(shù)據(jù)類型非常多,所以很適合做數(shù)值計算。下面給出常見的數(shù)據(jù)類型:
10、如何查看數(shù)組的類型?
數(shù)組(ndarrry)對象提供dtype屬性,用來查看數(shù)組類型。
import?numpy?as?np #?創(chuàng)建二維數(shù)組 x2?=?np.array([[1,2,3],[4,5,6]],dtype=int) #?返回類型 x2.dtype ''' 輸出:dtype('int32') '''11、如何改變數(shù)組的形狀?
前面說過,數(shù)組的shape屬性返回一個元組,能夠反映數(shù)組的形狀,包括維度以及每個軸的元素數(shù)量。
那么如果給定一個數(shù)組,怎么改變其形狀呢?
常用的方式有兩種:
reshape方法,它返回一個新的數(shù)組,而不能改變原始數(shù)組。
resize方法,無返回值,它更改了原始數(shù)組。
比如說我要將一個二維數(shù)組轉(zhuǎn)換為三維數(shù)組。
import?numpy?as?np #?創(chuàng)建二維數(shù)組 x2?=?np.array([[1,2,3],[4,5,6]]) #?將x2轉(zhuǎn)換為三維數(shù)組,并且自定義每個軸的元素數(shù)量 x2.reshape(1,2,3) ''' 輸出: array([[[1,?2,?3],[4,?5,?6]]]) '''reshape方法可以傳入整數(shù)或者元組形式的參數(shù)。
傳入的參數(shù)和shape屬性返回的元組的含義是一樣的。
例如, x2.reshape(1,2,3)是將二維數(shù)組轉(zhuǎn)換成三維數(shù)組,參數(shù)個數(shù)代表要轉(zhuǎn)換的維度,參數(shù)數(shù)字從左到右分別表示0軸、1軸、2軸的元素數(shù)量。
resize方法和reshape方法使用形式一樣,區(qū)別是resize方法改變了原始數(shù)組形狀。
import?numpy?as?np #?創(chuàng)建二維數(shù)組 x2?=?np.array([[1,2,3],[4,5,6]]) #?將x2轉(zhuǎn)換為三維數(shù)組,并且自定義每個軸的元素數(shù)量 x2.resize((1,2,3)) x2 ''' 輸出: array([[[1,?2,?3],[4,?5,?6]]]) '''12、如何對數(shù)組進行索引和切片操作?
numpy一維數(shù)組的索引和切片操作類似python列表,這里不多講。
比如說取一維數(shù)組前三個元素。
import?numpy?as?np #?創(chuàng)建一維數(shù)組 x1?=?np.array([1,2,3,4]) #?切片,取前三個元素 x1[:3] ''' 輸出: array([1,?2,?3]) '''重點是對多維數(shù)組的索引和切片。
多維數(shù)組有多個軸,那么就需要對每個軸進行索引。
例如,三維數(shù)組形狀為(x,y,z),分別代表:0軸有x個元素、1軸有y個元素,2軸有z個元素。
對0、1、2軸進行索引,如果取o軸第2個元素、1軸第0個元素、2軸第3個元素,那么索引形式就為[2,0,3]。
import?numpy?as?np #?創(chuàng)建三維數(shù)組 x3?=?np.arange(24).reshape(3,2,4) #?對該三維數(shù)組進行索引 x3[2,0,3]''' 輸出:19三維數(shù)組形式: array([[[?0,??1,??2,??3],[?4,??5,??6,??7]],[[?8,??9,?10,?11],[12,?13,?14,?15]],[[16,?17,?18,?19],[20,?21,?22,?23]]]) '''切片也是同樣道理。
如果取o軸前2個元素、1軸前1個元素、2軸后2個元素,那么切片形式就為[:2,:1,-2:]。
import?numpy?as?np #?創(chuàng)建三維數(shù)組 x3?=?np.arange(24).reshape(3,2,4) #?對該三維數(shù)組進行切片 x3[:2,:1,-2:]''' 輸出: array([[[?2,??3]],[[10,?11]]])三維數(shù)組形式: array([[[?0,??1,??2,??3],[?4,??5,??6,??7]],[[?8,??9,?10,?11],[12,?13,?14,?15]],[[16,?17,?18,?19],[20,?21,?22,?23]]]) '''13、如何對數(shù)組里每個元素進行迭代?
說到迭代,大家很容易想到直接對數(shù)組直接使用for循環(huán)操作,對于一維數(shù)組來說,當(dāng)然是可以的。
import?numpy?as?np #?創(chuàng)建一維數(shù)組 x1?=?np.array([1,2,3,4]) #?迭代 for?i?in?x1:print(i) ''' 輸出: 1 2 3 4 '''但對于多維數(shù)組,迭代是相對于0軸完成的,就是多維數(shù)組最外層的那一維。
你沒有辦法直接遍歷數(shù)組里每一個元素,嵌套循環(huán)又太低效。
這個時候就需要用到flat方法,它可以將多維數(shù)組平鋪為一維的迭代器。
import?numpy?as?np #?創(chuàng)建二維數(shù)組 x2?=?np.array([[1,2,3],[4,5,6]]) #?先平鋪,再迭代 for?i?in?x2.flat:print(i) ''' 輸出: 1 2 3 4 5 6 '''14、如何將多維數(shù)組展開為一維數(shù)組?
數(shù)組(ndarray)對象提供了ravel方法,用來將多維數(shù)組展開為一維數(shù)組。
import?numpy?as?np #?創(chuàng)建er維數(shù)組 x3?=?np.arange(12).reshape(3,4) #?對該三維數(shù)組進行索引 x3.ravel() ''' 輸出: array([?0,??1,??2,??3,??4,??5,??6,??7,??8,??9,?10,?11]) '''15、什么廣播機制?
廣播(Broadcast)是 numpy 對不同形狀(shape)的數(shù)組進行數(shù)值計算的方式, 對多個數(shù)組的算術(shù)運算通常在相應(yīng)的元素上進行。
較小的數(shù)組在較大的數(shù)組上“廣播”,以便它們具有兼容的形狀。
比如說一個一維數(shù)組乘以一個數(shù)字,相當(dāng)于一維數(shù)組里每個元素都乘以這個數(shù)。
import?numpy?as?np #?創(chuàng)建一維數(shù)組 x1?=?np.array([1,2,3]) #?廣播 x1?*?2 ''' 輸出: array([2,?4,?6]) '''如果相同維度的數(shù)組進行運算,其shape相同,那么廣播就是兩個數(shù)組相同位數(shù)的元素進行運算。
import?numpy?as?np #?創(chuàng)建一維數(shù)組 x1?=?np.array([1,2,3]) x2?=?np.array([4,5,6]) #?廣播 x1?+?x2 ''' 輸出: array([5,?7,?9]) '''如果兩個數(shù)組維度不同,進行運算,這里就觸發(fā)了廣播的兩個規(guī)則。
讓所有輸入數(shù)組都向其中形狀最長的數(shù)組看齊,形狀中不足的部分都通過在前面加 1 補齊;
當(dāng)輸入數(shù)組的某個維度的長度為 1 時,沿著此維度運算時都用此維度上的第一組值。
這兩個規(guī)則保證了不同維度數(shù)組進行運算時,其維度自動調(diào)整成一致。
import?numpy?as?np #?創(chuàng)建一維數(shù)組 x1?=?np.array([[1,2,3],[4,5,6]]) x2?=?np.array([2,3,4]) #?廣播 x1?-?x2 ''' 輸出: array([[-1,?-1,?-1],[?2,??2,??2]]) '''16、numpy中如何進行數(shù)值舍入操作?
around函數(shù),用于四舍五入,返回一個新數(shù)組
floor函數(shù),用于向下取整,返回一個新數(shù)組
ceil函數(shù),用于向上取整,返回一個新數(shù)組
17、如何對數(shù)組進行轉(zhuǎn)置操作?
numpy提供了transpose函數(shù)用以對數(shù)組進行維度的調(diào)換,也就是轉(zhuǎn)置操作。
轉(zhuǎn)置后返回一個新數(shù)組。
import?numpy?as?np #?創(chuàng)建二維數(shù)組 x1?=?np.arange(12).reshape(3,4) #?轉(zhuǎn)置 np.transpose(x1) ''' 輸出: array([[?0,??4,??8],[?1,??5,??9],[?2,??6,?10],[?3,??7,?11]]) 原數(shù)組: array([[?0,??1,??2,??3],[?4,??5,??6,??7],[?8,??9,?10,?11]]) '''當(dāng)然,可以用更簡單的方法。
數(shù)組對象提供了T方法,用于轉(zhuǎn)置,同樣會返回一個新數(shù)組。
import?numpy?as?np #?創(chuàng)建二維數(shù)組 x1?=?np.arange(12).reshape(3,4) #?轉(zhuǎn)置 x1.T ''' 輸出: array([[?0,??4,??8],[?1,??5,??9],[?2,??6,?10],[?3,??7,?11]]) 原數(shù)組: array([[?0,??1,??2,??3],[?4,??5,??6,??7],[?8,??9,?10,?11]]) '''18、如何連接兩個相同維度的數(shù)組?
numpy的concatenate 函數(shù)用于沿指定軸連接相同形狀的兩個或多個數(shù)組。
import?numpy?as?np #?創(chuàng)建兩個二維數(shù)組 x1?=?np.array([[1,2,3],[4,5,6]]) x2?=?np.array([[7,8,9],[10,11,12]]) #?連接,默認沿0軸連接 np.concatenate((x1,x2))''' 輸出: array([[?1,??2,??3],[?4,??5,??6],[?7,??8,??9],[10,?11,?12]]) '''#?指定沿1軸連接 np.concatenate((x1,x2),axis=1)''' 輸出: array([[?1,??2,??3,??7,??8,??9],[?4,??5,??6,?10,?11,?12]]) '''19、如何向數(shù)組添加值?
numpy的append 函數(shù)向數(shù)組末尾追加值,可以指定不同的軸。
numpy的insert 函數(shù)可以沿給定軸,在數(shù)組中任意位置插入數(shù)據(jù)。
20、如何對數(shù)組進行去重操作?
numpy的unique 函數(shù)用于去除數(shù)組中的重復(fù)元素,返回一個新數(shù)組。
import?numpy?as?np #?創(chuàng)建一個一維數(shù)組 x1?=?np.array([2,3,5,1,3,8,1,0]) np.unique(x1) ''' 輸出: array([0,?1,?2,?3,?5,?8]) '''unique函數(shù)還能返回重復(fù)元素的索引、計數(shù)等信息,可去查文檔自定義參數(shù)。
未完待續(xù)!
參考資料
[1]
numpy文檔: https://www.numpy.org.cn/
[2]菜鳥教程: https://www.runoob.com/numpy/numpy-tutorial.html
往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機器學(xué)習(xí)在線手冊深度學(xué)習(xí)在線手冊AI基礎(chǔ)下載(pdf更新到25集)本站qq群1003271085,加入微信群請回復(fù)“加群”獲取一折本站知識星球優(yōu)惠券,請回復(fù)“知識星球”喜歡文章,點個在看
總結(jié)
以上是生活随笔為你收集整理的【入门基础】Numpy基础20问的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【论文投稿】计算机学科部分核心期刊投稿攻
- 下一篇: 【入门基础】写给小白看的入门级 Java