欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python科學(xué)計(jì)算之narray對(duì)象用法

 更新時(shí)間:2019年11月25日 15:30:57   作者:NeverMore_7  
今天小編就為大家分享一篇python科學(xué)計(jì)算之narray對(duì)象用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

寫在前面

最近在系統(tǒng)的看一些python科學(xué)計(jì)算開源包的內(nèi)容,雖然以前是知道一些的,但都屬于零零碎碎的,希望這次能把常用的一些函數(shù)、注意項(xiàng)整理下。小白的一些廢話,高手請(qǐng)略過^ _ ^。文章中的函數(shù)僅僅是為了自己好理解,并沒有按照官方文檔上的函數(shù)聲明形式記錄。

numpy.narray

numpy.narray創(chuàng)建

numpy.narray的構(gòu)造方式挺多的,這里就不一一說明,因?yàn)橐话闱闆r下,在進(jìn)行科學(xué)計(jì)算時(shí)是通過給定的數(shù)據(jù)文件來讀取的,而讀取時(shí)使用的是pandas,具體可參考官方文檔,或者參見這位大牛的文章。

numpy.narray.shape & numpy.narray.reshape

numpy.narray的形狀可以用numpy.narray.shape屬性來獲取,它返回的是narray形狀的tuple,反映了各個(gè)軸的長度。

na_a = np.array([1,2,3,4]) #長度為4的一維數(shù)組
na_b = np.array([[1,2,3,4],[5,6,7,8]]) #2行4列的二維數(shù)組

out:
#print na_a
[1 2 3 4] 
#print na_b
[[1 2 3 4] 
 [5 6 7 8]] 
#print na_a.shape
(4,)
#print na_b.shape 
(2, 4) 

numpy.narray.shape相當(dāng)于一個(gè)c++的public成員,不僅可以獲取,還可以通過它改變narray的形狀。當(dāng)某一軸指定為-1時(shí),該軸的長度將通過其他軸來計(jì)算。

na_b.shape = (4,2)
na_a.shape = (2,-1)

out:
#print na_b
[[1 2]
 [3 4]
 [5 6]
 [7 8]]
#print na_a
 [[1 2]
 [3 4]]

需要注意的是:通過shape屬性改變narray的形狀時(shí),并沒對(duì)narray元素內(nèi)存中的位置改變,只是改變了外觀,僅僅是換了件馬甲。

當(dāng)然,如果你熟悉了使用函數(shù),不想使用屬性來改變形狀時(shí),可以通過narray.reshape(),注意的是該函數(shù)返回的結(jié)果和原narray共享內(nèi)存空間,換句話說,一個(gè)narray對(duì)象的改變將導(dǎo)致另一個(gè)narray也發(fā)生相應(yīng)的改變。

na_c = na_b.reshape((4,2))
na_c[0][0] = 100

out:
#print na_c
[[1 2]
 [3 4]
 [5 6]
 [7 8]]
#print na_c
[[100 2]
 [ 3 4]
 [ 5 6]
 [ 7 8]]
#print na_b
[[100 2]
 [ 3 4]
 [ 5 6]
 [ 7 8]]

numpy.narray.dtype

narray元素的類型可以使用dtype屬性來獲取,當(dāng)然也可以在構(gòu)造narray對(duì)象時(shí)指定元素的類型,需要注意的是,在numpy中float是64位,而complex是128位的。這里的float和complex是python內(nèi)置的數(shù)據(jù)類型,numpy也定義了自己的float等數(shù)據(jù)類型,而且更加的細(xì)化,比如float類型,numpy就有float16、float32、float64和float128.

af = np.array([1,2,3,4], dtype=float)
ac = np.array([5,6,7,8], dtype=complex)
af.dtype
ac.dtype

dtype('float64')
dtype('complex128')

python的完整數(shù)據(jù)類型中有大部分是所占字節(jié)來細(xì)化的,完整的數(shù)據(jù)在typeDict中定義,可通過numpy.typeDict.values()來獲取完整類型。numpy在多維數(shù)組上的計(jì)算很高效,但是在數(shù)值對(duì)象計(jì)算上卻比python慢很多,所以在進(jìn)行數(shù)值計(jì)算時(shí)應(yīng)避免使用numpy。

numpy.narray.astype() 類型轉(zhuǎn)換

numpy.narray.astype() 可以對(duì)narray對(duì)象中元素逐一進(jìn)行類型轉(zhuǎn)換。

a = np.array([1,2,3,4], dtype=np.float)
a.dtype
dtype('float64')

b = a.astype(np.int32)
b.dtype
dtype('int32')

c.dtype
c = a.astype(np.complex)
c.dtype
dtype('complex128')

numpy.narray的自動(dòng)生成

1.np.arange(start,end,step,dtype) 指定開始值、終值和步長生成一個(gè)等差數(shù)列,生成的narray中不包括end值。

2.np.linspace(start, end, element_nums, endpoint,dtype) 指定開始值、終值和元素個(gè)數(shù)生成一個(gè)等差數(shù)列,通過endpoint指定包不包括end,默認(rèn)為True。

3.np.logspace(start, end, element_nums, base, endpoint,dtype) endpoint默認(rèn)為True,base默認(rèn)為10,該函數(shù)產(chǎn)生一個(gè)等比數(shù)列,元素為

4.np.zeros(dim,dtype)對(duì)維度為dim的narray對(duì)象初始化為0,數(shù)據(jù)類型為dtype

5.np.ones(dim, dtype) 對(duì)維度為dim的narray對(duì)象初始化為1,數(shù)據(jù)類型為dtype

6.np.empty(dim,dtype) 該函數(shù)相當(dāng)于對(duì)narray對(duì)象分配內(nèi)存空間,但不進(jìn)行初始化,所以切不可認(rèn)為產(chǎn)生的元素為0。

7.np.full(dim, val, dtype) 產(chǎn)生維度為dim的narray對(duì)象并且全部初始為val,前面的zeros()和ones()可看作該函數(shù)的特殊形式。

8.上面函數(shù)的like版本,即np.zeros_like(object) 、np.ones_like(object) 、np.empty_like(object) 、np.full_like(object) ,這里的object是narray對(duì)象,這些函數(shù)產(chǎn)生的narray對(duì)象和上面一樣,但narray的維度(shape)以及數(shù)據(jù)類型(dtype)是和傳入的參數(shù)一樣的,例如np.zeros_like(object) ==np.zeros(object.shape, object.dtype)。

9.fromstring(s, dtype)這個(gè)函數(shù)是比較又意思的,將字符串轉(zhuǎn)換為一個(gè)narray對(duì)象, 我們先看看這個(gè)函數(shù)輸出情況。

s="abcdefgh"
np.fromstring(s)

array([ 8.54088322e+194]) ## 這是什么鬼?
### 輸出一下dtype呢?
dtype('float64')

顯然,這里是按照float64類型存放的,那如果換一個(gè)數(shù)據(jù)類型呢?

np.fromstring(s,dtype=np.int8)

array([ 97, 98, 99, 100, 101, 102, 103, 104], dtype=int8)

這個(gè)學(xué)過c語言的都應(yīng)該知道是ASCII編碼,也就可以看出,在python中一個(gè)字符是占8位,即一個(gè)字節(jié)的,繼續(xù)看:

np.fromstring(s,dtype=np.int16)

array([25185, 25699, 26213, 26727], dtype=int16)

這里改變數(shù)據(jù)類型位2個(gè)字節(jié),那么應(yīng)該是兩個(gè)字符聯(lián)立一起表示一個(gè)int16,25185=98*256+97,高位存放在低字節(jié)中,這是小端模式。OK,那如果我現(xiàn)在要存放的是[‘a(chǎn)','b'…'h']這樣的narray對(duì)象呢?數(shù)據(jù)類型是什么?應(yīng)該是‘|s1'

np.fromstring(s,'|S1')

array(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'],
  dtype='|S1')

frombuffer()也可以創(chuàng)建的narray對(duì)象,但此時(shí)創(chuàng)建的narray對(duì)象和原字符串是內(nèi)存共享的,學(xué)過c++的都知道,string類型是只讀類型,無法修改,所以在frombuffer()創(chuàng)建的narray無法做修改,如果要修改,請(qǐng)用fromstring()。

. fromfunction(fun, dim)通過自定義函數(shù)接口來創(chuàng)建narray對(duì)象,fun是一個(gè)函數(shù)名(看作指針),dim是一個(gè)創(chuàng)建對(duì)象的維度。

def fun(i):
 return i%4+1
np.fromfunction(fun,(10,))

array([ 1., 2., 3., 4., 1., 2., 3., 4., 1., 2.])

可見利用fromfunction()創(chuàng)建narray時(shí),參數(shù)i是從0開始自增的,自增的次數(shù)是維度的大小給定的,上面給定的維度位(10,),是一個(gè)一維數(shù)組,i從0自增到9(共10次)。看另外一個(gè)例子:

def fun2(i,j):
 return (i+1)*(j+1)
np.fromfunction(fun2,(9,9))

array([[ 1., 2., 3., 4., 5., 6., 7., 8., 9.],
  [ 2., 4., 6., 8., 10., 12., 14., 16., 18.],
  [ 3., 6., 9., 12., 15., 18., 21., 24., 27.],
  [ 4., 8., 12., 16., 20., 24., 28., 32., 36.],
  [ 5., 10., 15., 20., 25., 30., 35., 40., 45.],
  [ 6., 12., 18., 24., 30., 36., 42., 48., 54.],
  [ 7., 14., 21., 28., 35., 42., 49., 56., 63.],
  [ 8., 16., 24., 32., 40., 48., 56., 64., 72.],
  [ 9., 18., 27., 36., 45., 54., 63., 72., 81.]])

行可以看作j的自增,列可以看作i的自增,所以可以看作是兩個(gè)for循環(huán)。

numpy.narray的元素存取

可以按照python中l(wèi)ist存取元素的方式。

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

### 也可以指定步長,通過第三個(gè)數(shù)指定
a[1:-1:2] #從開始到結(jié)束,沒隔兩個(gè)數(shù)取一次 array([1, 3, 5, 7])
a[5:1:-2] #反向取 array([5, 3])

注意,通過這種方式取的新narray和原始narray內(nèi)存共享,所以任何一個(gè)改變,另一個(gè)也將改變。 除此之外,numpy還提供了一下幾個(gè)存取方式: 使用list存取,list的每個(gè)元素作為下標(biāo),這種方式得到的新narray和原始narray不共享內(nèi)存。

a = np.arange(10)
a[[1,1,7,7]] #array([1, 1, 7, 7])

使用narray提取新數(shù)組,narray的元素作為下標(biāo),得到的新narray維度和參數(shù)narray維度相同。這個(gè)有點(diǎn)繞,看個(gè)例子吧:

a[np.array([2,1,3,6])] #array([2, 1, 3, 6])
a[np.array([[2,1,3,6],[7,4,6,1]])] 
## 
## array([[2, 1, 3, 6],
  [7, 4, 6, 1]])

使用bool數(shù)組提取,提取bool數(shù)組中為True的下標(biāo)元素:

a[np.array([True, False,True,False,False,False,True,False,False,False])]

## array([0, 2, 6])

a[np.array([True,False,True,False,False,False,True,False,False,False])]=-1,-2,-3
print a #array([-1, 1, -2, 3, 4, 5, -3, 7, 8, 9])

多維數(shù)組

請(qǐng)先看一張圖:

左邊是用切片方式提取右邊6*6的narray對(duì)象元素。這種提取元素方式和原narray對(duì)象內(nèi)存共享。

這里個(gè)人的理解,利用切片方式提取的新narray和原narray是內(nèi)存共享的,而使用列表、bool數(shù)組等方式則不共享,原因很簡(jiǎn)單,利用切片方式,例如a[3:5],是從第三個(gè)元素到第5個(gè)元素(不包括),那么是用元素所占字節(jié)來移動(dòng)的,就像c中的指針,這樣比較便利。而其他方式是用下標(biāo),這些下標(biāo)往往不連續(xù),如果用指針方式的話則要來回移動(dòng),比較麻煩。所以不提供內(nèi)存共享這種方式。

在這之前我們使用切片都是通過在[]中指定起點(diǎn)、終點(diǎn)以及步長,如果要單獨(dú)創(chuàng)建切片對(duì)象呢?使用slice對(duì)象,創(chuàng)建的方式很簡(jiǎn)單,把[]中的:替換為None。

a = np.arange(0,60,10).reshape(-1,1)+np.arange(6)
### 廣播,后面會(huì)說到
array([[ 0, 1, 2, 3, 4, 5],
  [10, 11, 12, 13, 14, 15],
  [20, 21, 22, 23, 24, 25],
  [30, 31, 32, 33, 34, 35],
  [40, 41, 42, 43, 44, 45],
  [50, 51, 52, 53, 54, 55]])
a[::2,2:]
## 
array([[ 2, 3, 4, 5],
  [22, 23, 24, 25],
  [42, 43, 44, 45]])
idx = slice(None,None,2),slice(2,None)
a[idx]
##
array([[ 2, 3, 4, 5],
  [22, 23, 24, 25],
  [42, 43, 44, 45]])

同時(shí),numpy提供了IndexExpression類的對(duì)象s_來方便slice的創(chuàng)建。

np.s_[::2,2:]
## 
(slice(None, None, 2), slice(2, None, None))

結(jié)構(gòu)體數(shù)組

numpy提供了和c類似的結(jié)構(gòu)體數(shù)組,并且相互之間能夠讀取,以一個(gè)例子來說明:

## 創(chuàng)建persontype類型
persontype=np.dtype({
 'names':['name','age','weight'],
 'formats':['S30','i','f']}, align=True)
## 創(chuàng)建結(jié)構(gòu)體數(shù)組
a=np.array([("zhang",20,55.5), ("wang",24,65.2)], dtype=persontype)

persontype有兩個(gè)key,names和formats,names是以字典的方式標(biāo)明結(jié)構(gòu)體所含的字段,formats是對(duì)相應(yīng)字段的數(shù)據(jù)類型。S30表示長度不超過30個(gè)字節(jié)的字符串,i相當(dāng)于np.int32,f相當(dāng)于np.float32,下面創(chuàng)建結(jié)構(gòu)體數(shù)組的時(shí)候指定數(shù)據(jù)類型是我們創(chuàng)建的persontype。

## print a
array([('zhang', 20, 55.5  ), ('wang', 24, 65.19999695)],
  dtype={'names':['name','age','weight'], 'formats':['S30','<i4','<f4'], 'offsets':[0,32,36], 'itemsize':40, 'aligned':True})

## print a[0]
('zhang', 20, 55.5)
## a[0].dtype
dtype({'names':['name','age','weight'], 'formats':['S30','<i4','<f4'], 'offsets':[0,32,36], 'itemsize':40}, align=True)
## a[0]["name"]
'zhang'
b=a['age'] ## 20 24
b[0]=50
## print a[0]
('zhang', 50, 55.5)

通過tostring()和tofile()可以將結(jié)構(gòu)體數(shù)組寫入文件,并可以通過c讀取,由于c中的結(jié)構(gòu)體存在對(duì)齊,所以在python創(chuàng)建結(jié)構(gòu)體數(shù)組時(shí)也需要使用相應(yīng)的對(duì)齊方式,這一點(diǎn)通過align來指定,True為對(duì)齊,F(xiàn)alse不對(duì)齊。

narray內(nèi)存結(jié)構(gòu)

以二維narray對(duì)象為例,我們來看看narray對(duì)象在內(nèi)存中的結(jié)構(gòu)。

a = np.array([[0,1,2],[3,4,5],[6,7,8]], dtype=np.float32)

該二維數(shù)組的結(jié)構(gòu)如下圖:

左邊時(shí)一個(gè)結(jié)構(gòu)體,描述了該narray對(duì)象的基本信息,包括數(shù)據(jù)類型(np.float32)、維度(軸的數(shù)量)、每個(gè)軸的數(shù)據(jù)個(gè)數(shù)、每個(gè)軸相鄰元素的字節(jié)差、最后是存放數(shù)據(jù)的內(nèi)存地址。通過切片方式得到的新narray就是在data字段表示的內(nèi)存上獲得原始narray的視圖,我們來看看:

b=a[::2,::2]
## b
array([[ 0., 2.],
  [ 6., 8.]], dtype=float32)
## b.strides
(24, 8)

獲得的新narray.strides發(fā)生了變化,而這個(gè)變化也剛好是每個(gè)軸相鄰元素跨越的字節(jié)數(shù)。narray的數(shù)據(jù)在內(nèi)存上的排列有兩種形式,分別是C和FORTRAN格式,上面我們展示的就是C的格式,第0軸是最上位的,也就是說,第0軸作為行,所以第0軸的相鄰元素跨越的字節(jié)數(shù)是最多的(比如這里為3*4=12),而FORTRAN結(jié)構(gòu)與C格式相反,它是第1軸跨越的字節(jié)數(shù)最多。numpy默認(rèn)是C格式,如果想改成FORTRAN的格式,只需要在創(chuàng)建narray的時(shí)候設(shè)置order=‘F'。narray的flags屬性描述了存儲(chǔ)區(qū)的一些屬性:

## a.flags
C_CONTIGUOUS : True  #C語言格式
F_CONTIGUOUS : False #Fortran語言格式
OWNDATA : True   #數(shù)組是否擁有該存儲(chǔ)區(qū),如果是一個(gè)narray的視圖則不擁有
WRITEABLE : True  #是否可寫 (改變其中數(shù)據(jù))
ALIGNED : True   # 對(duì)齊
UPDATEIFCOPY : False

OK,這里引出一個(gè)東東,如果要將a進(jìn)行轉(zhuǎn)置,我們是需要將需要將a順時(shí)針旋轉(zhuǎn)90°,那么還有上面簡(jiǎn)單的方法?我們先看看a.T.flags:

## a.T.flags
 C_CONTIGUOUS : False
 F_CONTIGUOUS : True
 OWNDATA : False
 WRITEABLE : True
 ALIGNED : True
 UPDATEIFCOPY : False

從這上面可以看到,對(duì)于a的轉(zhuǎn)置,numpy是將其內(nèi)存格式改變了,從C語言格式變成了Fortran的格式,并且轉(zhuǎn)置是a的一個(gè)視圖。這樣的方式比旋轉(zhuǎn)方式更加快速。

以上這篇python科學(xué)計(jì)算之narray對(duì)象用法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python使用xlwt模塊操作Excel的方法詳解

    Python使用xlwt模塊操作Excel的方法詳解

    這篇文章主要介紹了Python使用xlwt模塊操作Excel的方法,結(jié)合實(shí)例形式分析了Python安裝xlwt模塊及使用xlwt模塊針對(duì)Excel文件的創(chuàng)建、設(shè)置、保存等常用操作技巧,需要的朋友可以參考下
    2018-03-03
  • 在PyTorch中使用標(biāo)簽平滑正則化的問題

    在PyTorch中使用標(biāo)簽平滑正則化的問題

    這篇文章主要介紹了如何在PyTorch中使用標(biāo)簽平滑正則化的問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • python使用fcntl模塊實(shí)現(xiàn)程序加鎖功能示例

    python使用fcntl模塊實(shí)現(xiàn)程序加鎖功能示例

    這篇文章主要介紹了python使用fcntl模塊實(shí)現(xiàn)程序加鎖功能,較為詳細(xì)的分析了fcntl模塊的具體功能并結(jié)合實(shí)例形式給出了Python實(shí)現(xiàn)程序加鎖的操作技巧,需要的朋友可以參考下
    2017-06-06
  • 使用python找出list列表中相同元素(指定元素)的所有索引

    使用python找出list列表中相同元素(指定元素)的所有索引

    這篇文章主要給大家介紹了關(guān)于使用python找出list列表中相同元素(指定元素)的所有索引,在平時(shí)開發(fā)過程中經(jīng)常遇到需要在數(shù)據(jù)中獲取特定的元素索引的信息,需要的朋友可以參考下
    2023-08-08
  • Python如何通過內(nèi)存管理提升程序執(zhí)行效率

    Python如何通過內(nèi)存管理提升程序執(zhí)行效率

    Python提供了自動(dòng)內(nèi)存管理的功能,但是如果不小心使用,可能會(huì)導(dǎo)致內(nèi)存泄漏和性能問題,所以巧妙使用內(nèi)存管理是提高Python執(zhí)行效率的關(guān)鍵,下面就來和大家仔細(xì)講講Python的內(nèi)存管理技巧吧
    2023-06-06
  • 用Python實(shí)現(xiàn)zip密碼破解實(shí)例

    用Python實(shí)現(xiàn)zip密碼破解實(shí)例

    大家好,本篇文章主要講的是用Python實(shí)現(xiàn)zip密碼破解實(shí)例,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • Python語法學(xué)習(xí)之線程的創(chuàng)建與常用方法詳解

    Python語法學(xué)習(xí)之線程的創(chuàng)建與常用方法詳解

    本文主要介紹了線程的使用,線程是利用進(jìn)程的資源來執(zhí)行業(yè)務(wù),并且通過創(chuàng)建多個(gè)線程,對(duì)于資源的消耗相對(duì)來說會(huì)比較低,今天就來看一看線程的使用方法具體有哪些吧
    2022-04-04
  • Python流程控制語句詳解

    Python流程控制語句詳解

    所有編程語言在編寫時(shí)都要遵守語音結(jié)構(gòu)和流程控制,他們控制了整個(gè)程序的運(yùn)行步驟。流程控制包括順序控制、條件控制和循環(huán)控制
    2022-07-07
  • django框架基于queryset和雙下劃線的跨表查詢操作詳解

    django框架基于queryset和雙下劃線的跨表查詢操作詳解

    這篇文章主要介紹了django框架基于queryset和雙下劃線的跨表查詢操作,結(jié)合實(shí)例形式詳細(xì)分析了Django框架queryset和雙下劃線的跨表查詢相關(guān)實(shí)現(xiàn)技巧與操作注意事項(xiàng),需要的朋友可以參考下
    2019-12-12
  • Python使用tkinter寫一個(gè)本地密碼管理器

    Python使用tkinter寫一個(gè)本地密碼管理器

    閑來無事,看到自己有很多網(wǎng)站的賬戶密碼,有些網(wǎng)站可能打開一兩次也就忘記了,下一次在輸入賬戶密碼就想不起來,這樣很容易丟失賬號(hào)。所以本文就來用Python和tkinter寫一個(gè)本地密碼管理器吧
    2023-05-05

最新評(píng)論