溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python之Numpy的超實用基礎(chǔ)詳細(xì)教程

發(fā)布時間:2020-10-25 18:55:03 來源:腳本之家 閱讀:161 作者:Yngz_Miao 欄目:開發(fā)技術(shù)

Numpy在python中屬于非常常用的包,無論是機(jī)器學(xué)習(xí)搭配pandas,還是數(shù)據(jù)可視化搭配pylab都是很正常的搭配。

Numpy

numpy的官方中文文檔:NumPy 中文

NumPy是使用Python進(jìn)行科學(xué)計算的基礎(chǔ)軟件包。除其他外,它包括:

  • 功能強(qiáng)大的N維數(shù)組對象;
  • 精密廣播功能函數(shù);
  • 集成C/C+和Fortran代碼的工具;
  • 強(qiáng)大的線性代數(shù)、傅立葉變換和隨機(jī)數(shù)功能。

更簡單的說,Numpy是Python的Matlab數(shù)學(xué)計算包。使用它,python可以更簡單便捷地對矩陣向量進(jìn)行計算。

一般來說,我們引用該包并將其簡稱為np:

import numpy as np

Numpy的ndarry對象

ndarray的創(chuàng)建

Numpy中最重要的數(shù)據(jù)類型就是:N維數(shù)組對象ndarray。它是一系列同類型數(shù)據(jù)的集合,以0下標(biāo)為開始進(jìn)行集合中元素的索引。

它具有以下兩個特點:

  • ndarray對象是用于存放同類型元素的多維數(shù)組;
  • ndarray中的每個元素在內(nèi)存中都有相同存儲大小的區(qū)域。

創(chuàng)建一個ndarray對象:

np.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)

參數(shù)說明:

名稱 描述
object 數(shù)組或嵌套的數(shù)列
dtype 數(shù)組元素的數(shù)據(jù)類型,可選
copy 對象是否需要復(fù)制,可選
order 創(chuàng)建數(shù)組的樣式,C為行方向,F(xiàn)為列方向,A為任意方向(默認(rèn))
subok 默認(rèn)返回一個與基類類型一致的數(shù)組
ndmin 指定生成數(shù)組的最小維度

一般而言,并不需要記住這么多可選參數(shù):

import numpy as np

if __name__ == "__main__":
 x = np.array([1, 2, 3])
 print(x)

運行該腳本:

yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py
[1 2 3]

當(dāng)然,除了之前的array方法創(chuàng)建ndarray對象之外,還提供了另外的幾種創(chuàng)建方式:

np.empty(shape, dtype = float, order = 'C')     # 指定形狀的未初始化數(shù)組

np.zeros(shape, dtype = float, order = 'C')     # 指定形狀的全0數(shù)組
np.ones(shape, dtype = None, order = 'C')      # 指定形狀的全1數(shù)組

np.arange(start = 0, stop, step = 1, dtype)     # 從起始值到終止值(不包含)時,按步長從范圍內(nèi)創(chuàng)建數(shù)組

np.linspace(start, stop, num = 50, endpoint = True, retstep = False, dtype = None)  # 從起始值到終止值(默認(rèn)包含)創(chuàng)建一個等差數(shù)組的一維數(shù)組
np.logspace(start, stop, num = 50, endpoint = True, base = 10.0, dtype = None) # 從起始值到終止值(默認(rèn)包含)創(chuàng)建一個等比數(shù)組的一維數(shù)組

Numpy也提供了從python其他類型直接轉(zhuǎn)換成ndarray的方式:

np.asarray(a, dtype = None, order = None)      # 列表形式
np.frombuffer(buffer, dtype = float, count = -1, offset = 0)      # 以流的形式讀入
np.fromiter(iterable, dtype, count=-1)     # 從可迭代對象中,以迭代器的形式讀入

例如:

import numpy as np

if __name__ == "__main__":
 a = [[1, 2 ,3], [4, 5]]
 b = 'Hello World'
 c = iter(range(5))

 x = np.asarray(a)
 y = np.frombuffer(b, dtype = 'S1')
 z = np.fromiter(c, dtype = float)

 print(x)
 print(y)
 print(z)

運行該腳本:

yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py
[list([1, 2, 3]) list([4, 5])]
['H' 'e' 'l' 'l' 'o' ' ' 'W' 'o' 'r' 'l' 'd']
[0. 1. 2. 3. 4.]

ndarray的數(shù)據(jù)結(jié)構(gòu)

Numpy支持很多的數(shù)據(jù)類型,下面就簡單地列舉一下:

名稱 描述
bool_ 布爾型數(shù)據(jù)類型(True或者False)
int_/int8/int16/int32/int64 有符號整數(shù)
uint8/uint16/uint32/uint64 無符號整數(shù)
float_/float16/float32/float64 浮點數(shù)
complex_/complex64/complex128 復(fù)數(shù)

但如果是自定義的數(shù)據(jù)類型,就需要通過dtype來確定了:

numpy.dtype(object, align, copy)

參數(shù)說明:

名稱 描述
object 要轉(zhuǎn)換為的數(shù)據(jù)類型對象
align 如果為true,填充字段使其類似C的結(jié)構(gòu)體
copy 復(fù)制dtype對象 ,如果為false,則是對內(nèi)置數(shù)據(jù)類型對象的引用

例如,可以創(chuàng)建一個student的對象:

import numpy as np

if __name__ == "__main__":
 student = np.dtype([('name', 'S20'), ('age', 'i8'), ('score', 'f4')])
 a = np.array([('zhangsan', 18, 80), ('lisi', 19, 85)], dtype=student)
 print(a)

運行該腳本:

yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py
[('zhangsan', 18, 80.) ('lisi', 19, 85.)]

ndarray的屬性

ndarray有兩個非常常用的屬性,shape和size。shape表示數(shù)組的維度,對于二維數(shù)組而言,就是其行數(shù)和列數(shù);size表示數(shù)組元素的總個數(shù),對于二維數(shù)組而言,就是行數(shù)與列數(shù)的相乘。

例如:

import numpy as np

if __name__ == "__main__":
 a = np.array([[1, 2, 3], [4, 5, 6]])
 print(a.shape)
 print(a.size)

運行該腳本:

yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py
(2, 3)
6

當(dāng)然,ndarray對象提供了兩種方式在不改變數(shù)據(jù)內(nèi)容的情況下,改變一個數(shù)組的格式。但兩種方式有所區(qū)別:

import numpy as np

if __name__ == "__main__":
 a = np.array([[1, 2, 3], [4, 5, 6]])
 a.shape = (3, 2)         # 直接改變本體
 print(a)
 b = a.reshape(2, 3)        # 本體不改變,將改變后的對象返回
 print(b)

運行該腳本:

yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py
[[1 2]
 [3 4]
 [5 6]]
[[1 2 3]
 [4 5 6]]

ndarray的內(nèi)容訪問

ndarray對象的內(nèi)容可以通過索引或切片來訪問和修改,與python中l(wèi)ist的切片操作一樣。

ndarray既可以基于下標(biāo)進(jìn)行切片,也可以通過內(nèi)置的slice函數(shù),并設(shè)置start,stop及step參數(shù)進(jìn)行,從原數(shù)組中切割出一個新數(shù)組。

例如:

import numpy as np

if __name__ == "__main__":
 a = np.arange(10)
 b = a[1:7:1]
 s = slice(1,7,1)
 c = a[s]

 print(a)
 print(b)
 print(c)

運行該腳本:

yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py
[0 1 2 3 4 5 6 7 8 9]
[1 2 3 4 5 6]
[1 2 3 4 5 6]

對于冒號:的解釋:

  • 如果是一維數(shù)組,如果只放置一個參數(shù),如[2],將返回與該索引相對應(yīng)的單個元素。如果為[2:],表示從該索引開始以后的所有項都將被提取。如果使用了兩個參數(shù),如[2:7],那么則提取兩個索引(不包括停止索引)之間的項;
  • 如果是多維數(shù)組,使用,區(qū)分維數(shù)。

例如:

import numpy as np

if __name__ == "__main__":
 a = np.arange(25)
 a.shape = (5, 5)

 b = a[1:4, 2:4]
 print(a)
 print(b)

運行該腳本:

yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]]
[[ 7  8]
 [12 13]
 [17 18]]

ndarray除了基于下標(biāo)進(jìn)行切片,還有一些高級索引方式,比如布爾索引、花式索引。

例如:

import numpy as np

if __name__ == "__main__":
 a = np.arange(25)
 a.shape = (5, 5)

 b = a[a > 6]
 c = a[[3, 2, 4]]
 print(a)
 print(b)
 print(c)

運行該腳本:

yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]]
[ 7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24]
[[15 16 17 18 19]
 [10 11 12 13 14]
 [20 21 22 23 24]]

其他

判斷元素對象是都為NaN:

np.isnan(...)

Numpy的廣播

如果兩個ndarray:a和b形狀相同,即滿足a.shape==b.shape,那么a與b的算數(shù)結(jié)果就是a與b數(shù)組對應(yīng)位做算術(shù)運算。這要求維數(shù)相同,且各維度的長度相同。

例如:

import numpy as np

if __name__ == "__main__":
 a = np.array([1, 2, 3])
 b = np.array([1, 2, 3])
 c = a + b
 d = a * b
 
 print(c)
 print(d)
 

運行該腳本:

yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py
[2 4 6]
[1 4 9]

而,廣播是Numpy對不同形狀(shape)的ndarray進(jìn)行數(shù)值計算的方式,對ndarray的算術(shù)運算通常在相應(yīng)的元素上進(jìn)行

怎么才算是相應(yīng)的元素呢?

雖然,廣播是對不同形狀(shape)而言,但其實還是要滿足兩個條件:列數(shù)相同,有一個行數(shù)為1。在這個前提下,每行的相同列的元素就是相對應(yīng)的元素。

直接看文字可能還是有點不太能理解,可以看一下例子:

import numpy as np

if __name__ == "__main__":
 a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
 b = np.array([1, 2, 3])
 c = a + b
 d = a * b
 
 print(c)
 print(d)

運行該腳本:

yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py
[[ 2  4  6]
 [ 5  7  9]
 [ 8 10 12]]
[[ 1  4  9]
 [ 4 10 18]
 [ 7 16 27]]

所謂廣播就是:當(dāng)列數(shù)相同的時候,行數(shù)為1的ndarray會進(jìn)行擴(kuò)行的操作,增加的行數(shù)內(nèi)容與原行的內(nèi)容相同。

擴(kuò)行的實現(xiàn)可以通過tile函數(shù)實現(xiàn):

np.tile(obj, (行, 列))    # 在行上和列上分別重復(fù)一定的次數(shù)

所以,上文的廣播也可以通過下面的方式來代替:

import numpy as np

if __name__ == "__main__":
 a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
 b = np.array([1, 2, 3])
 bb = np.tile(b, (3, 1))
 c = a + bb
 d = a * bb
 
 print(bb)
 print(c)
 print(d)

運行該腳本:

yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py
[[1 2 3]
 [1 2 3]
 [1 2 3]]
[[ 2  4  6]
 [ 5  7  9]
 [ 8 10 12]]
[[ 1  4  9]
 [ 4 10 18]
 [ 7 16 27]]

ndarray的函數(shù)

ndarray提供了很多的數(shù)學(xué)函數(shù)、算術(shù)函數(shù)、排序函數(shù),以便進(jìn)行運算。

ndarray的數(shù)學(xué)函數(shù),例如:

np.pi          # 圓周率
np.sin(obj)       # 三角運算
np.cos(obj)
np.tan(obj)
np.arcsin(obj)     # 反三角運算
np.arccos(obj)
np.arctan(obj)
np.degrees(obj)     # 將弧度值轉(zhuǎn)換為角度值

np.around(obj, decimals) # 返回ndarray每個元素的四舍五入值,decimals為舍入的小數(shù)位數(shù),默認(rèn)為0
np.floor(obj)      # 向下取整
np.ceil(obj)      # 向上取整

ndarray的算術(shù)函數(shù),例如:

np.add(obj1, obj2)        # 加減乘除運算,與+-*/效果一致,需要符合廣播原則
np.subtract(obj1, obj2)
np.multiply(obj1, obj2)
np.divide(obj1, obj2)
np.mod(obj1, obj2)        # 求余數(shù)運算

np.reciprocal(obj)        # 元素取倒數(shù)

np.power(obj1, obj2)       # 計算前參數(shù)為底,后參數(shù)為冪的值

ndarray的排序函數(shù),例如:

np.sort(obj, axis=1, kind='quicksort', order)

參數(shù)說明:

名稱 描述
obj 數(shù)組或嵌套的數(shù)列
axis axis=0按列排序,axis=1按行排序
kind ‘quicksort'、‘mergesort'、‘heapsort'
order 如果數(shù)組包含字段,則是要排序的字段

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI