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

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

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

Numpy 一维、二维数组、size/dtype/shape属性、数组函数arange/linspace/logspace /diag/zeros/ones/random 、多维数组索引和筛选)

發(fā)布時(shí)間:2023/11/27 生活经验 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Numpy 一维、二维数组、size/dtype/shape属性、数组函数arange/linspace/logspace /diag/zeros/ones/random 、多维数组索引和筛选) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

參考: https://gitbook.cn/gitchat/column/undefined/topic/5e3bceadec8d9033cf924665

打開(kāi) IPython ,創(chuàng)建 Python 的列表 a 對(duì)象。然后,使用列表生成式,創(chuàng)建一個(gè)元素都為原來(lái)兩倍的新列表 a2,并統(tǒng)計(jì)這一行的用時(shí)為 921 ms。

In [95]: a =list(range(10000000))In [96]: %time b = [i*2 for i in a]
Wall time: 921 ms

使用 NumPy ,創(chuàng)建同樣大小和取值的數(shù)組 na。然后,對(duì)每個(gè)元素乘以 2,返回一個(gè)新數(shù)組 na2,用時(shí)為 31 ms。

In [90]: import numpy as npIn [93]: na = np.array(range(10000000))In [94]: %time na = na*2
Wall time: 31.3 ms

可以看到,完成同樣的都對(duì)元素乘以 2 的操作, NumPyPython 快了 30 倍之多。

NumPy 計(jì)算為什么這么快呢?

  • Pythonlist 是一個(gè)通用結(jié)構(gòu)。它能包括任意類(lèi)型的對(duì)象,并且是動(dòng)態(tài)類(lèi)型。
  • NumPyndarray 是靜態(tài)、同質(zhì)的類(lèi)型,當(dāng) ndarray 對(duì)象被創(chuàng)建時(shí),元素的類(lèi)型就確定。

由于是靜態(tài)類(lèi)型,所以 ndarray 間的加、減、乘、除用 CFortran 實(shí)現(xiàn)才成為可能,所以運(yùn)行起來(lái)就會(huì)更快。根據(jù)官網(wǎng)介紹,底層代碼用 C 語(yǔ)言和 Fortran 語(yǔ)言實(shí)現(xiàn),實(shí)現(xiàn)性能無(wú)限接近 C 的處理效率。

1. 創(chuàng)建 Numpy 數(shù)組

1.1 一維數(shù)組 array

In [99]: import numpy as npIn [101]: np.array([1,2,3,4])
Out[101]: array([1, 2, 3, 4])

1.2 二維數(shù)組 array

In [102]: np.array([[1,2], [3,4]])
Out[102]: 
array([[1, 2],[3, 4]])

一維數(shù)組和二維數(shù)組的類(lèi)型都為 numpy.ndarray

In [103]: a = np.array([1,2,3,4])In [104]: b = np.array([[1,2], [3,4]])In [105]: type(a)
Out[105]: numpy.ndarrayIn [106]: type(b)
Out[106]: numpy.ndarray

1.3 arange 數(shù)組

In [22]: r = np.arange(1, 10, 1)In [23]: r
Out[23]: array([1, 2, 3, 4, 5, 6, 7, 8, 9])

arange() 的第一個(gè)值代表開(kāi)始值,第二個(gè)值代表終值(不包括這個(gè)值),最后一個(gè)值代表步長(zhǎng)(間隔),如 arange(1,10,1) 代表一個(gè)從 0-9,步長(zhǎng)為 1 的數(shù)組。

1.4 linspace 數(shù)組

返回 1 和 10 之間的 8 個(gè)元素。

In [110]: np.linspace(1, 10, 8)
Out[110]: 
array([ 1.        ,  2.28571429,  3.57142857,  4.85714286,  6.14285714,7.42857143,  8.71428571, 10.        ])In [111]: np.linspace(1, 10, 8)
Out[111]: 
array([ 1.        ,  2.28571429,  3.57142857,  4.85714286,  6.14285714,7.42857143,  8.71428571, 10.        ])In [112]: 

對(duì)于 linspace() ,它的前兩個(gè)值和 arange() 一樣,代表開(kāi)始值和終值,但有個(gè)區(qū)別是 linspace() 默認(rèn)包括終值,如果你不想包括終值,加上 endpoint = False 即可,對(duì)于第三個(gè)值它是指元素的個(gè)數(shù),這個(gè)和 arange 不一樣,一定不要混淆。

1.5 組合 ndarray 對(duì)象

如下創(chuàng)建一個(gè) ndarray 對(duì)象 a

In [112]: a = np.arange(10).reshape(2, -1)In [113]: a
Out[113]: 
array([[0, 1, 2, 3, 4],[5, 6, 7, 8, 9]])

找出 a 中大于 4 的元素索引,使用 where 方法,返回一個(gè)元組,帶有 2 個(gè) ndarray 對(duì)象,分別表示大于 4 的元素第一維、第二維度中的位置:

In [114]: np.where(a>4)
Out[114]: (array([1, 1, 1, 1, 1], dtype=int64), array([0, 1, 2, 3, 4], dtype=int64))

我們把它拼接為一個(gè) ndarray 對(duì)象:

In [115]: np.array(np.where(a>4))
Out[115]: 
array([[1, 1, 1, 1, 1],[0, 1, 2, 3, 4]], dtype=int64)

然后,再轉(zhuǎn)置,使用 np.transpose 方法:

In [117]: np.transpose(x)
Out[117]: 
array([[1, 0],[1, 1],[1, 2],[1, 3],[1, 4]], dtype=int64)In [118]: 

可以很明顯的看出 [1, 0] 表示大于 4 的元素在原 ndarray 對(duì)象的索引。

2. Numpy 數(shù)組屬性

2.1 shape 屬性

shape 屬性返回?cái)?shù)組的形狀信息,是一個(gè)元組對(duì)象。

In [118]: a = np.zeros(5)In [120]: b = np.ones((2, 3))In [121]: a
Out[121]: array([0., 0., 0., 0., 0.])In [122]: b
Out[122]: 
array([[1., 1., 1.],[1., 1., 1.]])

可以看到 a 是一維的,而 b 是一個(gè) 2*3 的數(shù)組,打印它們的 shape 信息,可以看到:

In [124]: a.shape
Out[124]: (5,)In [125]: b.shape
Out[125]: (2, 3)In [126]: 

2.2 size 屬性

size 屬性獲取數(shù)組內(nèi)元素個(gè)數(shù):

In [126]: a.size
Out[126]: 5In [127]: b.size
Out[127]: 6In [128]: 

2.3 dtype 屬性

dtype 屬性獲取數(shù)組內(nèi)元素的類(lèi)型:

In [128]: a.dtype
Out[128]: dtype('float64')In [129]: b.dtype
Out[129]: dtype('float64')

創(chuàng)建數(shù)組時(shí),還可以通過(guò)為 dtype 賦值,指定元素類(lèi)型:

In [134]: m = np.array([1,2,3])In [135]: m.dtype
Out[135]: dtype('int32')In [136]: m = np.array([1,2,3], dtype='float')In [137]: m.dtype
Out[137]: dtype('float64')

dtype 更多取值: int 、 complexbool 、 object ,還可以顯示的定義數(shù)據(jù)位數(shù)的類(lèi)型,如: int64int16 、 float128 、 complex128 。

3. 數(shù)組函數(shù)

3.1 arange 函數(shù)

起始點(diǎn),終點(diǎn),步長(zhǎng);不包括終點(diǎn)。

In [138]: np.arange(1, 10, 2)
Out[138]: array([1, 3, 5, 7, 9])In [139]: 

3.2 linspace 函數(shù)


起始點(diǎn),終點(diǎn),分割份數(shù);包括終點(diǎn)。

In [139]: np.linspace(1, 10, 7)
Out[139]: array([ 1. ,  2.5,  4. ,  5.5,  7. ,  8.5, 10. ])In [140]: 

3.3 logspace 函數(shù)

創(chuàng)建以 e 為底,指數(shù)為 1,2,…,10 的數(shù)組:

In [140]: np.logspace(1, 10, 3)
Out[140]: array([1.00000000e+01, 3.16227766e+05, 1.00000000e+10])In [141]: 

3.4 diag 對(duì)角函數(shù)

創(chuàng)建對(duì)角數(shù)組:

In [141]: np.diag([1,2,3,4])
Out[141]: 
array([[1, 0, 0, 0],[0, 2, 0, 0],[0, 0, 3, 0],[0, 0, 0, 4]])

主對(duì)角線偏移 1 的數(shù)組:

In [142]: np.diag([1,2,3,4],k=1)
Out[142]: 
array([[0, 1, 0, 0, 0],[0, 0, 2, 0, 0],[0, 0, 0, 3, 0],[0, 0, 0, 0, 4],[0, 0, 0, 0, 0]])In [143]: 

3.5 zeros 函數(shù)

創(chuàng)建一個(gè)全零的數(shù)組,接受參數(shù)為數(shù)組的維度

In [143]: np.zeros(3)
Out[143]: array([0., 0., 0.])In [145]: np.zeros((3,4))
Out[145]: 
array([[0., 0., 0., 0.],[0., 0., 0., 0.],[0., 0., 0., 0.]])In [146]: np.zeros((2,3,4))
Out[146]: 
array([[[0., 0., 0., 0.],[0., 0., 0., 0.],[0., 0., 0., 0.]],[[0., 0., 0., 0.],[0., 0., 0., 0.],[0., 0., 0., 0.]]])In [147]: 

3.6 ones 函數(shù)

創(chuàng)建一個(gè)全 1 的數(shù)組

In [147]: np.ones(3)
Out[147]: array([1., 1., 1.])In [148]: np.ones((2,3))
Out[148]: 
array([[1., 1., 1.],[1., 1., 1.]])In [149]: np.ones((2,3,1))
Out[149]: 
array([[[1.],[1.],[1.]],[[1.],[1.],[1.]]])In [150]: 

3.7 random 隨機(jī)數(shù)組

生成 0~1、shape 為 (2,3) 的隨機(jī)數(shù)數(shù)組:

In [151]: np.random.rand(2,3)
Out[151]: 
array([[0.50761977, 0.73557945, 0.84018083],[0.1117079 , 0.02225728, 0.51466307]])In [152]: 


4. 多維索引和篩選

4.1 二維數(shù)組

In [37]: a = np.arange(25).reshape(5,5)In [38]: a
Out[38]: 
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, 24]])In [39]: a[0]
Out[39]: array([0, 1, 2, 3, 4])In [40]: a[1]
Out[40]: array([5, 6, 7, 8, 9])In [43]: a[0:2]
Out[43]: 
array([[0, 1, 2, 3, 4],[5, 6, 7, 8, 9]])In [47]: a[1:3]
Out[47]: 
array([[ 5,  6,  7,  8,  9],[10, 11, 12, 13, 14]])In [48]: a[0][0]
Out[48]: 0In [53]: a[0,0]
Out[53]: 0In [51]: 

a[0][0]a[0,0] 是等價(jià)的。

4.2 三維數(shù)組

NumPy 索引,功能強(qiáng)大,不僅支持切片操作,還支持布爾型按條件篩選操作。

In [152]: m = np.arange(18).reshape(2,3,3)In [153]: n = np.arange(18)In [154]: m
Out[154]: 
array([[[ 0,  1,  2],[ 3,  4,  5],[ 6,  7,  8]],[[ 9, 10, 11],[12, 13, 14],[15, 16, 17]]])

: 表示此維度的所有元素全部獲取:

In [155]: m[:,1:2,:]
Out[155]: 
array([[[ 3,  4,  5]],[[12, 13, 14]]])In [156]: m[:,1:2,:1]
Out[156]: 
array([[[ 3]],[[12]]])In [157]: 

按照維度賦值:

In [157]: m[:,0,:] = -2In [158]: m
Out[158]: 
array([[[-2, -2, -2],[ 3,  4,  5],[ 6,  7,  8]],[[-2, -2, -2],[12, 13, 14],[15, 16, 17]]])In [159]: m[:,:,1]
Out[159]: 
array([[-2,  4,  7],[-2, 13, 16]])In [160]: 

判斷上面切片 m[:,:,0] 中大于 5 的元素,寫(xiě)法簡(jiǎn)潔,無(wú)需寫(xiě) for 循環(huán)。

In [160]: m
Out[160]: 
array([[[-2, -2, -2],[ 3,  4,  5],[ 6,  7,  8]],[[-2, -2, -2],[12, 13, 14],[15, 16, 17]]])In [161]: m[m>5]
Out[161]: array([ 6,  7,  8, 12, 13, 14, 15, 16, 17])In [162]: 

總結(jié)

以上是生活随笔為你收集整理的Numpy 一维、二维数组、size/dtype/shape属性、数组函数arange/linspace/logspace /diag/zeros/ones/random 、多维数组索引和筛选)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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