柚子快報(bào)激活碼778899分享:numpy基礎(chǔ)
柚子快報(bào)激活碼778899分享:numpy基礎(chǔ)
什么是 NumPy?
NumPy是Python中科學(xué)計(jì)算的基礎(chǔ)包。它是一個(gè)Python庫(kù),提供多維數(shù)組對(duì)象,各種派生對(duì)象(如掩碼數(shù)組和矩陣),以及用于數(shù)組快速操作的各種API,有包括數(shù)學(xué)、邏輯、形狀操作、排序、選擇、輸入輸出、離散傅立葉變換、基本線性代數(shù),基本統(tǒng)計(jì)運(yùn)算和隨機(jī)模擬等等。 NumPy包的核心是 ndarray 對(duì)象。它封裝了python原生的同數(shù)據(jù)類型的 n 維數(shù)組,為了保證其性能優(yōu)良,其中有許多操作都是代碼在本地進(jìn)行編譯后執(zhí)行的。
NumPy數(shù)組 和 原生Python Array(數(shù)組)之間有幾個(gè)重要的區(qū)別:
NumPy 數(shù)組在創(chuàng)建時(shí)具有固定的大小,與Python的原生數(shù)組對(duì)象(可以動(dòng)態(tài)增長(zhǎng))不同。更改ndarray的大小將創(chuàng)建一個(gè)新數(shù)組并刪除原來(lái)的數(shù)組。NumPy 數(shù)組中的元素都需要具有相同的數(shù)據(jù)類型,因此在內(nèi)存中的大小相同。 例外情況:Python的原生數(shù)組里包含了NumPy的對(duì)象的時(shí)候,這種情況下就允許不同大小元素的數(shù)組。NumPy 數(shù)組有助于對(duì)大量數(shù)據(jù)進(jìn)行高級(jí)數(shù)學(xué)和其他類型的操作。通常,這些操作的執(zhí)行效率更高,比使用Python原生數(shù)組的代碼更少。越來(lái)越多的基于Python的科學(xué)和數(shù)學(xué)軟件包使用NumPy數(shù)組; 雖然這些工具通常都支持Python的原生數(shù)組作為參數(shù),但它們?cè)谔幚碇皶?huì)還是會(huì)將輸入的數(shù)組轉(zhuǎn)換為NumPy的數(shù)組,而且也通常輸出為NumPy數(shù)組。換句話說,為了高效地使用當(dāng)今科學(xué)/數(shù)學(xué)基于Python的工具(大部分的科學(xué)計(jì)算工具),你只知道如何使用Python的原生數(shù)組類型是不夠的 - 還需要知道如何使用 NumPy 數(shù)組。
安裝最新的numpy
安裝最新的穩(wěn)定版本:pip install numpy
import numpy as np
print(np.__version__)
arr1 = np.array((1, 2, 3))
# arr1 = np.array(range(1, 4))
# arr1 = np.array([1, 2, 3])
print(arr1)
print(type(arr1))
print(isinstance(arr1, np.ndarray))
# print(isinstance(arr1, Iterable))
numpy的常用屬性
# a = np.arange(15).reshape(3, 5)
a = np.array([
[[1, 2, 3], [4, 5, 6]],
[[7, 8, 9], [10,11, 12.]]
], dtype=np.int32)
print ("數(shù)組的形狀:",a.shape)
print ("數(shù)組軸的個(gè)數(shù):",a.ndim)
print ("數(shù)組元素類型:",a.dtype)
print ("數(shù)組中每個(gè)元素的字節(jié)大小:",a.itemsize)
print ("數(shù)組元素的總個(gè)數(shù):", a.size)
print ("類型查詢:",type(a))
print ("------------")
#創(chuàng)建一個(gè)數(shù)組
b = np.array([6, 7, 8])
print ("數(shù)組b:",b)
print ("數(shù)組的形狀:",b.shape)
print ("數(shù)組軸的個(gè)數(shù):",b.ndim)
print ("數(shù)組b類型:",type(b))
ndarray的常用函數(shù)
ndarray 多維數(shù)組(N Dimension Array) NumPy數(shù)組是一個(gè)多維的數(shù)組對(duì)象(矩陣),稱為ndarray,具有矢量算術(shù)運(yùn)算能力和復(fù)雜的廣播能力,并具有執(zhí)行速度快和節(jié)省空間的特點(diǎn)。注意:ndarray的下標(biāo)從0開始,且數(shù)組里的所有元素必須是相同類型。
array()
import numpy as np
a = np.array([2, 3, 4])
print ("數(shù)組a元素類型:",a)
print ("數(shù)組a類型:",a.dtype)
b = np.array([1.2, 3.5, 5.1])
print ("數(shù)組b元素類型:",b.dtype)
zeros() /ones()/empty()
函數(shù)function創(chuàng)建一個(gè)全是0的數(shù)組,函數(shù)ones創(chuàng)建一個(gè)全1的數(shù)組,函數(shù)empty創(chuàng)建一個(gè)內(nèi)容隨機(jī)并且依賴于內(nèi)存狀態(tài)的數(shù)組。默認(rèn)創(chuàng)建的數(shù)組類型(dtype)都是float64
zeros1=np.zeros( (3,4) )
print ("數(shù)組zeros1:",zeros1)
ones1=np.ones((2,3,4))
print ("數(shù)組ones1:",ones1)
empty1 = np.empty((2, 3))
print ("數(shù)組empty1:",empty1)
arange()
arange() 類似 python 的 range() ,創(chuàng)建一個(gè)一維 ndarray 數(shù)組。
np_arange = np.arange(10, 20, 5,dtype=int)
print ("arange創(chuàng)建np_arange:",np_arange)
print( "arange創(chuàng)建np_arange的元素類型:",np_arange.dtype)
print ("arange創(chuàng)建np_arange的類型:",type(np_arange))
matrix()
matrix 是 ndarray 的子類,只能生成 2 維的矩陣
x1=np.mat("1 2;3 4")
print( x1)
x2=np.matrix("1,2;3,4")
print( x2)
x3=np.matrix([[1,2,3,4],[5,6,7,8]])
print( x3)
創(chuàng)建隨機(jī)數(shù)矩陣random.rand()
import numpy as np
# 生成指定維度大?。?行4列)的隨機(jī)多維浮點(diǎn)型數(shù)據(jù)(二維),rand固定區(qū)間0.0 ~ 1.0
arr = np.random.rand(3, 4)
print(arr)
print(type(arr))
# 生成指定維度大小(3行4列)的隨機(jī)多維整型數(shù)據(jù)(二維),randint()可以指定區(qū)間(-1, 5)
arr = np.random.randint(-1, 5, size = (3, 4))
print(arr)
print(type(arr))
# 生成指定維度大?。?行4列)的隨機(jī)多維浮點(diǎn)型數(shù)據(jù)(二維),uniform()可以指定區(qū)間(-1, 5)產(chǎn)生-1到5之間均勻分布的樣本值
arr = np.random.uniform(-1, 5, size = (3, 4)) #
print(arr)
print(type(arr))
ndarray的數(shù)據(jù)類型
dtype參數(shù),指定數(shù)組的數(shù)據(jù)類型,類型名+位數(shù),如float64, int32astype方法,轉(zhuǎn)換數(shù)組的數(shù)據(jù)類型
# 初始化3行4列數(shù)組,數(shù)據(jù)類型為float64
zeros_float_arr = np.zeros((3, 4), dtype=np.float64)
print(zeros_float_arr)
print(zeros_float_arr.dtype) #float64
# astype轉(zhuǎn)換數(shù)據(jù)類型,將已有的數(shù)組的數(shù)據(jù)類型轉(zhuǎn)換為int32
zeros_int_arr = zeros_float_arr.astype(np.int32)
print(zeros_int_arr)
print(zeros_int_arr.dtype) #int32
等比/等差數(shù)列
np.logspace等比數(shù)列
logspace中,開始點(diǎn)和結(jié)束點(diǎn)是10的冪 我們讓開始點(diǎn)為0,結(jié)束點(diǎn)為0,元素個(gè)數(shù)為10,看看輸出結(jié)果。
a = np.logspace(0,0,10)
a
# 輸出結(jié)果
# array([ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
● 我們看下面的例子,0代表10的0次方,9代表10的9次方。
a = np.logspace(0,9,10)
a
# 輸出結(jié)果
# array([1.e+00, 1.e+01, 1.e+02, 1.e+03, 1.e+04, 1.e+05, 1.e+06, 1.e+07,
# 1.e+08, 1.e+09])
● 假如,我們想要改變基數(shù),不讓它以10為底數(shù),我們可以改變base參數(shù),將其設(shè)置為2試試。
a = np.logspace(0,9,10,base=2)
a
# 輸出結(jié)果
# array([ 1., 2., 4., 8., 16., 32., 64., 128., 256., 512.])
np.linspace等差數(shù)列
np.linspace是用于創(chuàng)建一個(gè)一維數(shù)組,并且是等差數(shù)列構(gòu)成的一維數(shù)組,它最常用的有三個(gè)參數(shù)。 ● 第一個(gè)例子,用到三個(gè)參數(shù),第一個(gè)參數(shù)表示起始點(diǎn),第二個(gè)參數(shù)表示終止點(diǎn),第三個(gè)參數(shù)表示數(shù)列的個(gè)數(shù)。
a = np.linspace(1,10,10)
a
# 輸出結(jié)果
# array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.])
● linspace創(chuàng)建的數(shù)組元素是浮點(diǎn)型。
a.dtype
# 輸出結(jié)果
# dtype('float64')
● 可以使用參數(shù)endpoint來(lái)決定是否包含終止值,默認(rèn)值為True。
a = np.linspace(1,10,10,endpoint=False)
a
# 輸出結(jié)果
# array([ 1. , 1.9, 2.8, 3.7, 4.6, 5.5, 6.4, 7.3, 8.2, 9.1])
NumPy內(nèi)置函數(shù)
基本函數(shù)
np.ceil(): 向上最接近的整數(shù),參數(shù)是 number 或 arraynp.floor(): 向下最接近的整數(shù),參數(shù)是 number 或 arraynp.rint(): 四舍五入,參數(shù)是 number 或 arraynp.isnan(): 判斷元素是否為 NaN(Not a Number),參數(shù)是 number 或 arraynp.multiply(): 元素相乘,參數(shù)是 number 或 arraynp.divide(): 元素相除,參數(shù)是 number 或 arraynp.abs():元素的絕對(duì)值,參數(shù)是 number 或 arraynp.where(condition, x, y): 三元運(yùn)算符,x if condition else y
# randn() 返回具有標(biāo)準(zhǔn)正態(tài)分布的序列。
arr = np.random.randn(2,3)
print(arr)
print(np.ceil(arr))
print(np.floor(arr))
print(np.rint(arr))
print(np.isnan(arr))
print(np.multiply(arr, arr))
print(np.divide(arr, arr))
print(np.where(arr > 0, 1, -1))
統(tǒng)計(jì)函數(shù)
np.mean(), np.sum():所有元素的平均值,所有元素的和,參數(shù)是 number 或 arraynp.max(), np.min():所有元素的最大值,所有元素的最小值,參數(shù)是 number 或 arraynp.std(), np.var():所有元素的標(biāo)準(zhǔn)差,所有元素的方差,參數(shù)是 number 或 arraynp.argmax(), np.argmin():最大值的下標(biāo)索引值,最小值的下標(biāo)索引值,參數(shù)是 number 或 arraynp.cumsum(), np.cumprod():返回一個(gè)一維數(shù)組,每個(gè)元素都是之前所有元素的 累加和 和 累乘積,參數(shù)是 number 或 array 多維數(shù)組默認(rèn)統(tǒng)計(jì)全部維度,axis參數(shù)可以按指定軸心統(tǒng)計(jì),值為0則按列統(tǒng)計(jì),值為1則按行統(tǒng)計(jì)。
arr = np.arange(12).reshape(3,4)
print(arr)
print(np.cumsum(arr)) # 返回一個(gè)一維數(shù)組,每個(gè)元素都是之前所有元素的 累加和
print(np.sum(arr)) # 所有元素的和
print(np.sum(arr, axis=0)) # 數(shù)組的按列統(tǒng)計(jì)和
print(np.sum(arr, axis=1)) # 數(shù)組的按行統(tǒng)計(jì)和
比較函數(shù)
假如我們想要知道矩陣a和矩陣b中所有對(duì)應(yīng)元素是否相等,我們需要使用all方法,假如我們想要知道矩陣a和矩陣b中對(duì)應(yīng)元素是否有一個(gè)相等,我們需要使用any方法。
np.any(): 至少有一個(gè)元素滿足指定條件,返回Truenp.all(): 所有的元素滿足指定條件,返回True
arr = np.random.randn(2,3)
print(arr)
print(np.any(arr > 0))
print(np.all(arr > 0))
去重函數(shù)
np.unique():找到唯一值并返回排序結(jié)果,類似于Python的set集合
arr = np.array([[1, 2, 1], [2, 3, 4]])
print(arr)
print(np.unique(arr))
排序函數(shù)
對(duì)數(shù)組元素進(jìn)行排序
arr = np.array([1, 2, 34, 5])
print ("原數(shù)組arr:",arr)
#np.sort()函數(shù)排序,返回排序后的副本
sortarr1= np.sort(arr)
print ("numpy.sort()函數(shù)排序后的數(shù)組:",sortarr1)
# ndarray直接調(diào)用sort,在原數(shù)據(jù)上進(jìn)行修改
arr.sort()
print ("數(shù)組.sort()方法排序:",arr)
NumPy運(yùn)算
基本運(yùn)算
數(shù)組的算數(shù)運(yùn)算是按照元素的。新的數(shù)組被創(chuàng)建并且被結(jié)果填充。
import numpy as np
a = np.array([20,30,40,50])
b = np.arange(4)
c = a-b
print("數(shù)組a:",a)
print("數(shù)組b:",b)
print("數(shù)組運(yùn)算a-b:",c)
矩陣乘法
import numpy as np
x=np.array([[1,2,3],[4,5,6]])
y=np.array([[6,23],[-1,7],[8,9]])
print(x)
print(y)
print(x.dot(y))
print(np.dot(x,y))
a = np.array([[1,2,3], [4,5,6]])
b = np.array([[2,2,2],[3,3,3]])
print(a*b)
索引和切片
數(shù)組的索引和切片與 Python 中序列的索引和切片操作基本類似,不同點(diǎn)在于: 數(shù)組切片不會(huì)復(fù)制內(nèi)部數(shù)組數(shù)據(jù),只會(huì)生成原始數(shù)據(jù)的新視圖數(shù)組支持多維數(shù)組的多維索引和切片
下標(biāo)切片
slice對(duì)象
# slice 是一個(gè)實(shí)現(xiàn)切片的對(duì)象,主要用在切片操作函數(shù)里的參數(shù)傳遞。
# class slice(start, stop[, step])
# start 為切片起始位置,stop 為切片終止位置(不包括以 stop 索引的元素),step 為步長(zhǎng)。
x = np.arange(10)
# 冒號(hào) : 的解釋:如果只放置一個(gè)參數(shù),
# 如 [2],將返回與該索引相對(duì)應(yīng)的單個(gè)元素。
# 如果為 [2:],表示從該索引開始以后的所有項(xiàng)都將被提取。
# 如果使用了兩個(gè)參數(shù),如 [2:8],那么則提取兩個(gè)索引(不包括停止索引)之間的項(xiàng)。
arr_cut = slice(2,8,3)
print(x[arr_cut])
索引切片
import numpy as np
lis = [[1, 2], [3, 4], [5, 6]]
arr = np.array(lis)
print(arr)
print ("數(shù)組的形狀:",arr.shape)
print ("數(shù)組軸的個(gè)數(shù):",arr.ndim)
print ("數(shù)組元素類型:",arr.dtype)
print ("數(shù)組中每個(gè)元素的字節(jié)大小:",arr.itemsize)
print ("數(shù)組元素的總個(gè)數(shù):", arr.size)
print ("類型查詢:",type(arr))
print ("------------------")
print(arr[1, 0])
print ("------------------")
print(arr[1][1])
print ("------------------")
print(arr[:2, 1:2])
print ("------------------")
print(arr[:2][1:2])
# arr[:2, 1:2]是對(duì)多維數(shù)組進(jìn)行同時(shí)切片操作,而arr[:2][1:2]是對(duì)切片結(jié)果進(jìn)行連續(xù)切片操作,兩者的結(jié)果會(huì)有所不同。
# print(arr[:2, 1:2]): 這種語(yǔ)法是對(duì)多維數(shù)組進(jìn)行切片操作。
# 在這種情況下,arr[:2, 1:2]表示獲取二維數(shù)組中行索引在0到1(不包括2)之間,列索引在1到2(不包括2)之間的子數(shù)組。換句話說,這個(gè)操作將獲取二維數(shù)組的前兩行中第二列的元素組成的子數(shù)組。
# print(arr[:2][1:2]): lis[:2]將會(huì)獲取列表的前兩個(gè)元素,即[[1, 2], [3, 4]],然后[1:2]將會(huì)獲取該切片中的第二個(gè)元素,即[3, 4]。因此,print(result)的輸出結(jié)果將會(huì)是[3, 4]。
[:2, 1:2])與[:2][1:2]的區(qū)別
arr[:2, 1:2]是對(duì)多維數(shù)組進(jìn)行同時(shí)切片操作, arr[:2][1:2]是對(duì)切片結(jié)果進(jìn)行連續(xù)切片操作,兩者的結(jié)果會(huì)有所不同。
布爾索引及切片
布爾型索引指的是一個(gè)布爾型ndarray數(shù)組(一般為一維)對(duì)應(yīng)另一個(gè)ndarray數(shù)組的每行,布爾型數(shù)組的個(gè)數(shù)要必須與另一個(gè)多維數(shù)組的行數(shù)一致。若布爾型數(shù)組內(nèi)的某個(gè)元素為True,則選取另一個(gè)多維數(shù)組的行,反之不選取。
# 布爾型索引及切片
# 布爾型索引指的是一個(gè)布爾型ndarray數(shù)組(一般為一維)對(duì)應(yīng)另一個(gè)ndarray數(shù)組的每行,布爾型數(shù)組的個(gè)數(shù)要必須與另一個(gè)多維數(shù)組的行數(shù)一致。若布爾型數(shù)組內(nèi)的某個(gè)元素為True,則選取另一個(gè)多維數(shù)組的行,反之不選取。
import numpy as np
zarten = np.random.randn(5,4)
print(zarten)
print('*' * 50)
## 選取第一行和最后一行
zarten_bool = np.array([True, False, False, False, True])
print(zarten[zarten_bool])
zarten = np.random.randn(5,4)
print(zarten)
print('*' * 50)
zarten_1 = np.array(['A', 'B', 'C', 'D', 'A'])
print(zarten[zarten_1 == 'A'])
print('*' * 50)
print(zarten[zarten_1 == 'A', 1:3]) #切片
花式索引及切片
花式索引跟布爾型索引類似,花式索引是可以使用整數(shù)數(shù)組進(jìn)行索引,可以選取任意的行,跟布爾型索引的[True, False , False]類似,可以任意選取?;ㄊ剿饕奖阈?注意:花式索引是傳入整數(shù)數(shù)組。若為負(fù)數(shù),將從末尾開始選取
import numpy as np
zarten = np.random.randn(5,4)
print(zarten)
print('*' * 50)
#選取第一行和第二行
#布爾型索引做法
zarten_bool = np.array([True, True, False, False, False])
print(zarten[zarten_bool])
print('*' * 50)
#花式索引做法
print(zarten[[0, 1]])
print('*' * 50)
#花式索引切片做法
print(zarten[[0, 1], 1:3])
axis參數(shù)
在numpy中,axis參數(shù)用于指定沿著哪個(gè)軸進(jìn)行操作,例如對(duì)于一個(gè)二維數(shù)組,軸0表示沿著行的方向,軸1表示沿著列的方向。對(duì)于多維數(shù)組,每一個(gè)軸都對(duì)應(yīng)一個(gè)維度。在numpy中許多函數(shù)都支持axis參數(shù),常見的函數(shù)包括sum(),mean(),max(),min(),argmax()和argmin()等。 例如,對(duì)于以下二維數(shù)組:
arr = np.array([[1, 2, 3], [4, 5, 6]])
我們可以統(tǒng)計(jì)每列的和:
np.sum(arr, axis=0) # 返回?cái)?shù)組 [5, 7, 9]
也可以統(tǒng)計(jì)每行的平均值:
np.mean(arr, axis=1) # 返回?cái)?shù)組 [2., 5.]
需要注意的是,axis參數(shù)不止可以取0和1這樣的值,對(duì)于多維數(shù)組,還可以取2,3等。而且,不同的函數(shù)對(duì)于axis參數(shù)的實(shí)現(xiàn)方式也可能有所不同,因此具體使用時(shí)需要查看文檔或者自行嘗試以確保正確使用。
柚子快報(bào)激活碼778899分享:numpy基礎(chǔ)
精彩鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。