日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

NumPy之:ndarray中的函数

發(fā)布時(shí)間:2024/2/28 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NumPy之:ndarray中的函数 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 簡(jiǎn)介
  • 簡(jiǎn)單函數(shù)
  • 矢量化數(shù)組運(yùn)算
  • 條件邏輯表達(dá)式
  • 統(tǒng)計(jì)方法
  • 布爾數(shù)組
  • 排序
  • 文件
  • 線性代數(shù)
  • 隨機(jī)數(shù)

簡(jiǎn)介

在NumPy中,多維數(shù)組除了基本的算數(shù)運(yùn)算之外,還內(nèi)置了一些非常有用的函數(shù),可以加快我們的科學(xué)計(jì)算的速度。

簡(jiǎn)單函數(shù)

我們先看下比較常見(jiàn)的運(yùn)算函數(shù),在使用之前,我們先構(gòu)造一個(gè)數(shù)組:

arr = np.arange(10) array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

計(jì)算數(shù)組中元素的開(kāi)方:

np.sqrt(arr) array([0. , 1. , 1.4142, 1.7321, 2. , 2.2361, 2.4495, 2.6458,2.8284, 3. ])

自然常數(shù)e為底的指數(shù)函數(shù):

np.exp(arr) array([ 1. , 2.7183, 7.3891, 20.0855, 54.5982, 148.4132,403.4288, 1096.6332, 2980.958 , 8103.0839])

取兩個(gè)數(shù)組的最大值,組成新的數(shù)組:

x = np.random.randn(8) y = np.random.randn(8) x,y (array([-2.3594, -0.1995, -1.542 , -0.9707, -1.307 , 0.2863, 0.378 ,-0.7539]),array([ 0.3313, 1.3497, 0.0699, 0.2467, -0.0119, 1.0048, 1.3272,-0.9193])) np.maximum(x, y) array([ 0.3313, 1.3497, 0.0699, 0.2467, -0.0119, 1.0048, 1.3272,-0.7539])

返 回浮點(diǎn)數(shù)數(shù)組的小數(shù)和整數(shù)部分:

arr = np.random.randn(7) * 5 array([-7.7455, 0.1109, 3.7918, -3.3026, 4.3129, -0.0502, 0.25 ]) remainder, whole_part = np.modf(arr) (array([-0.7455, 0.1109, 0.7918, -0.3026, 0.3129, -0.0502, 0.25 ]),array([-7., 0., 3., -3., 4., -0., 0.]))

矢量化數(shù)組運(yùn)算

如果要進(jìn)行數(shù)組之間的運(yùn)算,常用的方法就是進(jìn)行循環(huán)遍歷,但是這樣的效率會(huì)比較低。所以Numpy提供了數(shù)組之間的數(shù)據(jù)處理的方法。

先來(lái)講解一下 np.meshgrid 這個(gè)函數(shù),這個(gè)函數(shù)是用來(lái)快速生成網(wǎng)格點(diǎn)坐標(biāo)矩陣的。

先看一段坐標(biāo)點(diǎn)的代碼:

import numpy as np import matplotlib.pyplot as pltx = np.array([[0, 1, 2], [0, 1, 2]]) y = np.array([[0, 0, 0], [1, 1, 1]])plt.plot(x, y,color='green',marker='.',linestyle='') plt.grid(True) plt.show()

上面的X是一個(gè)二維數(shù)組,表示的是坐標(biāo)點(diǎn)的X軸的位置。

Y也是一個(gè)二維數(shù)組,表示的是坐標(biāo)點(diǎn)的Y軸的位置。

看下畫(huà)出來(lái)的圖像:

上面畫(huà)出的就是使用X,Y矩陣組合出來(lái)的6個(gè)坐標(biāo)點(diǎn)。

上面的X,Y的二維數(shù)組是我們手動(dòng)輸入的,如果坐標(biāo)上面有大量點(diǎn)的話,手動(dòng)輸入肯定是不可取的。

于是有了np.meshgrid這個(gè)函數(shù)。這個(gè)函數(shù)可以接受兩個(gè)一維的數(shù)組,然后生成二維的X,Y坐標(biāo)矩陣。

上面的例子可以改寫(xiě)為:

x = np.array([0,1,2]) y = np.array([0,1])xs, ys = np.meshgrid(x, y) xs,ys (array([[0, 1, 2],[0, 1, 2]]), array([[0, 0, 0],[1, 1, 1]]))

可以看到生成的xs和ys和手動(dòng)輸入是一樣的。

有了網(wǎng)格坐標(biāo)之后,我們就可以基于網(wǎng)格值來(lái)計(jì)算一些數(shù)據(jù),比如:sqrt(x2+y2)sqrt(x^2+y^2)sqrt(x2+y2) ,我們不用變量矩陣中所有的數(shù)據(jù),只需要直接使用數(shù)組進(jìn)行運(yùn)算即可:

np.sqrt(xs ** 2 + ys ** 2)

結(jié)果:

array([[0. , 1. , 2. ],[1. , 1.41421356, 2.23606798]])

因?yàn)閤s 和ys本身就是2 * 3 的矩陣,所以結(jié)果也是 2 * 3 的矩陣。

條件邏輯表達(dá)式

我們可以在構(gòu)建數(shù)組的時(shí)候使用條件邏輯表達(dá)式:

xarr = np.array([1.1, 1.2, 1.3, 1.4, 1.5]) yarr = np.array([2.1, 2.2, 2.3, 2.4, 2.5]) cond = np.array([True, False, True, True, False]) result = [(x if c else y)for x, y, c in zip(xarr, yarr, cond)] result [1.1, 2.2, 1.3, 1.4, 2.5]

更簡(jiǎn)單一點(diǎn),我們可以使用where語(yǔ)句:

result = np.where(cond, xarr, yarr) result array([1.1, 2.2, 1.3, 1.4, 2.5])

我們還可以根據(jù)where的條件來(lái)修改數(shù)組的值:

arr = np.random.randn(4, 4) arr array([[ 0.7953, 0.1181, -0.7485, 0.585 ],[ 0.1527, -1.5657, -0.5625, -0.0327],[-0.929 , -0.4826, -0.0363, 1.0954],[ 0.9809, -0.5895, 1.5817, -0.5287]])

上面我們構(gòu)建了一個(gè)4 * 4 的數(shù)組。

我們可以在where中進(jìn)行數(shù)據(jù)的比較,如果大于0,將數(shù)據(jù)修改成2 ,如果小于0,則將數(shù)據(jù)修該成-2 :

np.where(arr > 0, 2, -2) array([[ 2, 2, -2, 2],[ 2, -2, -2, -2],[-2, -2, -2, 2],[ 2, -2, 2, -2]])

統(tǒng)計(jì)方法

numpy提供了mean,sum等統(tǒng)計(jì)方法:

arr = np.random.randn(5, 4) arr arr.mean() np.mean(arr) arr.sum()

還可以按維度來(lái)統(tǒng)計(jì):

arr.mean(axis=1) arr.sum(axis=0)

cumsum進(jìn)行累加計(jì)算:

arr = np.array([0, 1, 2, 3, 4, 5, 6, 7]) arr.cumsum() array([ 0, 1, 3, 6, 10, 15, 21, 28])

cumprod進(jìn)行累乘計(jì)算:

arr = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) arr arr.cumsum(axis=0) array([[ 0, 1, 2],[ 3, 5, 7],[ 9, 12, 15]]) arr.cumprod(axis=1) array([[ 0, 0, 0],[ 3, 12, 60],[ 6, 42, 336]])

布爾數(shù)組

any用于測(cè)試數(shù)組中是否存在一個(gè)或多個(gè)True,而all則檢查數(shù)組中所有值是否都是True:

bools = np.array([False, False, True, False]) bools.any() True bools.all() False

排序

使用sort可以對(duì)數(shù)組進(jìn)行排序,除了普通排序還可以按照特定的軸來(lái)進(jìn)行排序:

arr = np.random.randn(6) arr.sort() array([-2.5579, -1.2943, -0.2972, -0.1516, 0.0765, 0.1608]) arr = np.random.randn(5, 3) arr arr.sort(1) arr array([[-0.8852, -0.4936, -0.1875],[-0.3507, -0.1154, 0.0447],[-1.1512, -0.8978, 0.8909],[-2.6123, -0.8671, 1.1413],[-0.437 , 0.3475, 0.3836]])

sort(1)指的是按照第二個(gè)軸來(lái)排序。

文件

可以方便的將數(shù)組寫(xiě)入到文件和從文件中讀出:

arr = np.arange(10) np.save('some_array', arr)

會(huì)將數(shù)組存放到some_array.npy文件中,我們可以這樣讀取:

np.load('some_array.npy')

還可以以無(wú)壓縮的方式存入多個(gè)數(shù)組:

np.savez('array_archive.npz', a=arr, b=arr)

讀取:

arch = np.load('array_archive.npz') arch['b']

如果想要壓縮,可以這樣:

np.savez_compressed('arrays_compressed.npz', a=arr, b=arr)

線性代數(shù)

如果我們使用普通的算數(shù)符來(lái)進(jìn)行矩陣的運(yùn)算的話,只是簡(jiǎn)單的數(shù)組中對(duì)應(yīng)的元素的算數(shù)運(yùn)算。如果我們想做矩陣之間的乘法的時(shí)候,可以使用dot。

一個(gè) 2 * 3 的矩陣 dot 一個(gè)3*2 的矩陣,最終得到一個(gè)2 * 2 的矩陣。

x = np.array([[1., 2., 3.], [4., 5., 6.]]) y = np.array([[6., 23.], [-1, 7], [8, 9]]) x y x.dot(y) array([[ 28., 64.],[ 67., 181.]])

或者可以這樣寫(xiě):

np.dot(x, y) array([[ 28., 64.],[ 67., 181.]])

還可以使用 @ 符號(hào):

x @ y array([[ 28., 64.],[ 67., 181.]])

我們看下都有哪些運(yùn)算:

乘積運(yùn)算:

操作符描述
dot(a, b[, out])矩陣點(diǎn)積
linalg.multi_dot(arrays, *[, out])多個(gè)矩陣點(diǎn)積
vdot(a, b)向量點(diǎn)積
inner(a, b)兩個(gè)數(shù)組的內(nèi)積
outer(a, b[, out])兩個(gè)向量的外積
matmul(x1, x2, /[, out, casting, order, …])兩個(gè)矩陣的對(duì)應(yīng)位的乘積
tensordot(a, b[, axes])計(jì)算沿指定軸的張量點(diǎn)積
einsum(subscripts, *operands[, out, dtype, …])愛(ài)因斯坦求和約定
einsum_path(subscripts, *operands[, optimize])通過(guò)考慮中間數(shù)組的創(chuàng)建,評(píng)估einsum表達(dá)式的最低成本收縮順序。
linalg.matrix_power(a, n)矩陣的冪運(yùn)算
kron(a, b)矩陣的Kronecker乘積

分解運(yùn)算:

操作符描述
linalg.cholesky(a)Cholesky 分解
linalg.qr(a[, mode])計(jì)算矩陣的qr因式分解
linalg.svd(a[, full_matrices, compute_uv, …])奇異值分解

本征值和本征向量:

操作描述
linalg.eig(a)計(jì)算方陣的特征值和右特征向量。
linalg.eigh(a[, UPLO])返回復(fù)數(shù)Hermitian(共軛對(duì)稱(chēng))或?qū)崒?duì)稱(chēng)矩陣的特征值和特征向量。
linalg.eigvals(a)計(jì)算通用矩陣的特征值。
linalg.eigvalsh(a[, UPLO])計(jì)算復(fù)數(shù)Hermitian(共軛對(duì)稱(chēng))或?qū)崒?duì)稱(chēng)矩陣的特征值。

基準(zhǔn)值:

操作描述
linalg.norm(x[, ord, axis, keepdims])矩陣或向量范數(shù)
linalg.cond(x[, p])Compute the condition number of a matrix.
linalg.det(a)矩陣行列式
linalg.matrix_rank(M[, tol, hermitian])使用SVD方法返回?cái)?shù)組的矩陣秩
linalg.slogdet(a)計(jì)算數(shù)組行列式的符號(hào)和(自然)對(duì)數(shù)。
trace(a[, offset, axis1, axis2, dtype, out])返回沿?cái)?shù)組對(duì)角線的和。

求解和反轉(zhuǎn):

操作描述
linalg.solve(a, b)求解線性矩陣方程或線性標(biāo)量方程組。
linalg.tensorsolve(a, b[, axes])對(duì)x求解張量方程’a x = b’。
linalg.lstsq(a, b[, rcond])將最小二乘解返回線性矩陣方程
linalg.inv(a)計(jì)算矩陣的(乘法)逆。
linalg.pinv(a[, rcond, hermitian])計(jì)算矩陣的(Moore-Penrose)偽逆。
linalg.tensorinv(a[, ind])計(jì)算N維數(shù)組的“逆”。

隨機(jī)數(shù)

很多時(shí)候我們都需要生成隨機(jī)數(shù),在NumPy中隨機(jī)數(shù)的生成非常簡(jiǎn)單:

samples = np.random.normal(size=(4, 4)) samples array([[-2.0016, -0.3718, 1.669 , -0.4386],[-0.5397, 0.477 , 3.2489, -1.0212],[-0.5771, 0.1241, 0.3026, 0.5238],[ 0.0009, 1.3438, -0.7135, -0.8312]])

上面用normal來(lái)得到一個(gè)標(biāo)準(zhǔn)正態(tài)分布的4×4樣本數(shù)組。

使用np.random要比使用Python自帶的隨機(jī)數(shù)生成器要快得多。

np.random可以指定生成隨機(jī)數(shù)的種子:

np.random.seed(1234)

numpy.random的數(shù)據(jù)生成函數(shù)使用了全局的隨機(jī)種子。要避免 全局狀態(tài),你可以使用numpy.random.RandomState,創(chuàng)建一個(gè) 與其它隔離的隨機(jī)數(shù)生成器:

rng = np.random.RandomState(1234) rng.randn(10)

本文已收錄于 http://www.flydean.com/10-python-numpy-func/

最通俗的解讀,最深刻的干貨,最簡(jiǎn)潔的教程,眾多你不知道的小技巧等你來(lái)發(fā)現(xiàn)!

歡迎關(guān)注我的公眾號(hào):「程序那些事」,懂技術(shù),更懂你!

總結(jié)

以上是生活随笔為你收集整理的NumPy之:ndarray中的函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。