国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

python 中的list和array的不同之處及轉(zhuǎn)換問(wèn)題

2020-01-04 15:40:24
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

python中的list是python的內(nèi)置數(shù)據(jù)類型,list中的數(shù)據(jù)類不必相同的,而array的中的類型必須全部相同。在list中的數(shù)據(jù)類型保存的是數(shù)據(jù)的存放的地址,簡(jiǎn)單的說(shuō)就是指針,并非數(shù)據(jù),這樣保存一個(gè)list就太麻煩了,例如list1=[1,2,3,'a']需要4個(gè)指針和四個(gè)數(shù)據(jù),增加了存儲(chǔ)和消耗cpu。

      numpy中封裝的array有很強(qiáng)大的功能,里面存放的都是相同的數(shù)據(jù)類型

list1=[1,2,3,'a'] print list1 a=np.array([1,2,3,4,5]) b=np.array([[1,2,3],[4,5,6]]) c=list(a)  # array到list的轉(zhuǎn)換 print a,np.shape(a) print b,np.shape(b) print c,np.shape(c) 

運(yùn)行結(jié)果:

[1, 2, 3, 'a'] # 元素?cái)?shù)據(jù)類型不同,并且用逗號(hào)隔開 [1 2 3 4 5] (5L,) # 一維數(shù)組,類型用tuple表示 [[1 2 3]  [4 5 6]] (2L, 3L) [1, 2, 3, 4, 5] (5L,) 

創(chuàng)建:

    array的創(chuàng)建:參數(shù)既可以是list,也可以是元組.使用對(duì)應(yīng)的屬性shape直接得到形狀

a=np.array((1,2,3,4,5))# 參數(shù)是元組 b=np.array([6,7,8,9,0])# 參數(shù)是list c=np.array([[1,2,3],[4,5,6]])# 參數(shù)二維數(shù)組 print a,b, c.shape() 

   也可以直接改變屬性array的形狀,-1代表的是自己推算。這里并不是T, reshape(())也可以

c = np.array([[1, 2, 3, 4],[4, 5, 6, 7], [7, 8, 9, 10]]) c.shape # (3L, 4L) c.shape=4,-1  //c.reshape((2,-1)) c  <pre style="box-sizing: border-box; overflow: auto; font-size: 14px; padding: 0px; margin-top: 0px; margin-bottom: 0px; line-height: 17.0001px; word-break: break-all; word-wrap: break-word; border: 0px; border-radius: 0px; white-space: pre-wrap; vertical-align: baseline; background-color: rgb(255, 255, 255);">array([[ 1, 2, 3],     [ 4, 4, 5],     [ 6, 7, 7],     [ 8, 9, 10]])  

 
   這里的reshape最終相當(dāng)于是一個(gè)淺拷貝,也就是說(shuō)還是和原來(lái)的書c使用相同的內(nèi)存空間

d=c.reshape((2,-1)) d[1:2]=100 c array([[ 1,  2,  3],    [ 4,  4,  5],    [100, 100, 100],    [100, 100, 100]])

   前面在創(chuàng)建數(shù)組的時(shí)候并沒(méi)有使用數(shù)據(jù)類型,這里我們也可以使用數(shù)據(jù)類型。默認(rèn)的是int32.

a1=np.array([[1,2,3],[4,5,6]],dtype=np.float64) print a1.dtype,a.dtype #float64 int32<pre style="margin-top: 0px; margin-bottom: 0px; line-height: 17.0001px; box-sizing: border-box; overflow: auto; font-size: 14px; padding: 0px; word-break: break-all; word-wrap: break-word; border: 0px; border-radius: 0px; white-space: pre-wrap; vertical-align: baseline; background-color: rgb(255, 255, 255);"> 

前面在創(chuàng)建的時(shí)候我們都是使用的np.array()方法從tuple或者list轉(zhuǎn)換成為array,感覺很是費(fèi)勁,numpy自己提供了很多的方法讓我們自己直接創(chuàng)建一個(gè)array.

arr1=np.arange(1,10,1) #  arr2=np.linspace(1,10,10) print arr1,arr1.dtype print arr2,arr2.dtype [1 2 3 4 5 6 7 8 9] int32[ 1.  2.  3.  4.  5.  6.  7.  8.  9. 10.] float64

   np.arange(a,b,c)表示產(chǎn)生從a-b不包括b,間隔為c的一個(gè)array,數(shù)據(jù)類型默認(rèn)是int32。但是linspace(a,b,c)表示的是把a(bǔ)-b平均分成c分,它包括b。   

   有時(shí)候我們需要對(duì)于每一個(gè)元素的坐標(biāo)進(jìn)行賦予不同的數(shù)值,可以使用fromfunction函數(shù)

def fun(i):   return i%4+2 np.fromfunction(fun,(10,)) array([ 2., 3., 4., 5., 2., 3., 4., 5., 2., 3.])  

   fromfunction必須支持多維數(shù)組,所以他的第二個(gè)參數(shù)必須是一個(gè)tuple,只能是(10,),(10)是錯(cuò)誤的。

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.]])

        雖然說(shuō),這里提供了很多的直接產(chǎn)生array的方式,但是大部分情況我們都是會(huì)從list進(jìn)行轉(zhuǎn)換,因?yàn)樵趯?shí)際的處理中,我們需要從txt加載文件,那樣直接讀入的數(shù)據(jù)顯示存放到list中,需要處理的時(shí)候我們轉(zhuǎn)換到array,因?yàn)?br /> array的設(shè)計(jì)更加符合我們的使用,涉及到矩陣的運(yùn)算在使用mat,那么list主要就是用進(jìn)行元素的索取。

def loaddataSet(fileName):    file=open(fileName)    dataMat=[] //   for line in file.readlines():      curLine=line.strip().split('/t')      floatLine=map(float,curLine)//這里使用的是map函數(shù)直接把數(shù)據(jù)轉(zhuǎn)化成為float類型      dataMat.append(floatLine)    return dataMat  

    上面的韓順?lè)祷刈罱K的數(shù)據(jù)就是最初的list數(shù)據(jù)集,再根據(jù)不同的處理需求是轉(zhuǎn)化到array還是mat。其實(shí)array是mat的父類,能用mat的地方,array理論上都能傳入。

 元素訪問(wèn):    

arr[5] #5 arr[3:5] #array([3, 4]) arr[:5] #array([0, 1, 2, 3, 4]) arr[:-1]# array([0, 1, 2, 3, 4, 5, 6, 7, 8]) arr[:] #array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) arr[2:4]=100 # array([ 0,  1, 100, 100,  4,  5,  6,  7,  8,  9]) arr[1:-1:2] #array([ 1, 100,  5,  7]) 2 是間隔 arr[::-1] #array([ 9,  8,  7,  6,  5,  4, 100, 100,  1,  0])  arr[5:2:-1]# -1的間隔表示從右向左所以5>2 #array([ 5,  4, 100]) 

   上面是array的一維數(shù)組的訪問(wèn)方式,我們?cè)賮?lái)看看二維的處理方式

print c[1:2]# c[1:2].shape-->(1L, 3L) print c[1:2][0] # shape-->(3L,) [[4 4 5]][4 4 5][python] view plain copy print c[1] print c[1:2] [4 4 5][[4 4 5]][python] view plain copy print c[1][2] print c[1:4] print c[1:4][0][2] 5[[ 4  4  5] [100 100 100] [100 100 100]]5

   可以看出對(duì)于有:的表達(dá)最終的結(jié)果外面還嵌套一層list的[],。訪問(wèn)的一定要注意,python最bug的就是,語(yǔ)法
靈活,不管怎樣寫索引語(yǔ)法都是正確的,但是最終的書結(jié)果卻讓你大跌眼鏡。

    還有array的索引最終產(chǎn)生的是一個(gè)一個(gè)原始數(shù)據(jù)的淺拷貝,還和原來(lái)的數(shù)據(jù)共用一塊兒內(nèi)存

b=arr[1:6] b[:3]=0 arr #<pre style="box-sizing: border-box; overflow: auto; font-size: 14px; padding: 0px; margin-top: 0px; margin-bottom: 0px; line-height: 17.0001px; word-break: break-all; word-wrap: break-word; border: 0px; border-radius: 0px; white-space: pre-wrap; vertical-align: baseline; background-color: rgb(255, 255, 255);">array([0, 0, 0, 0, 4, 5, 6, 7, 8, 9]) 

    產(chǎn)生上面的原因是因?yàn)閍rray中直接存放的數(shù)據(jù),拷貝的話直接拿走的是pointer,沒(méi)有取走數(shù)據(jù),但是list卻會(huì)直接發(fā)生深拷貝,數(shù)據(jù)指針全部帶走

list1=list(c) list1[1]=0 list1 #上面修改的0并沒(méi)有被改變 [array([1, 2, 3]), 0, array([100, 100, 100]), array([100, 100, 100])]

   除了這些之外還有自己的更加牛掰的方式(只能用array)

   1)使用布爾數(shù)組.感覺甚是強(qiáng)大,就不要自己寫什么判斷語(yǔ)句啦,注意這種方式得到結(jié)果不和原始數(shù)組共享空間。布爾索引僅僅適用于數(shù)組array,list沒(méi)資格用。布爾索引最終得到下標(biāo)索引為true的數(shù)據(jù)。索引只能是布爾數(shù)組

a=np.array(a*2) a>5 a[a>5] #  array([16, 32, 48, 64, 80, 16, 32, 48, 64, 80])

   2)列表索引

      列表索引可以是數(shù)組和list。返回的數(shù)據(jù)不和原來(lái)的數(shù)據(jù)共享內(nèi)存。索引可以是list和array

x=np.arange(10) index=[1,2,3,4,5] arr_index=np.array(index) print x print x[index] # list索引 print x[arr_index] # array索引 [0 1 2 3 4 5 6 7 8 9][1 2 3 4 5][1 2 3 4 5]

  array和list區(qū)別*2

a=np.arange(10) lista=list(a) print a*2 print lista*2 [ 0 2 4 6 8 10 12 14 16 18][0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

  array的廣播

a = np.arange(0, 60, 10).reshape(-1, 1) b = np.arange(0, 5) print a print b [[ 0] [10] [20] [30] [40] [50]][0 1 2 3 4]print np.add(a,b,c) [[ 0 1 2 3 4] [10 11 12 13 14] [20 21 22 23 24] [30 31 32 33 34] [40 41 42 43 44] [50 51 52 53 54]]

總結(jié)

以上所述是小編給大家介紹的python 中的list和array的不同之處及轉(zhuǎn)換問(wèn)題,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)VEVB武林網(wǎng)網(wǎng)站的支持!


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到python教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 株洲县| 普兰县| 嘉义县| 依安县| 竹溪县| 海城市| 融水| 芜湖市| 鄂尔多斯市| 灌阳县| 普格县| 秭归县| 沧州市| 邹城市| 丹凤县| 许昌市| 福鼎市| 宜春市| 陈巴尔虎旗| 昂仁县| 雅安市| 阿坝县| 仙桃市| 保定市| 黄平县| 喜德县| 崇州市| 象州县| 衡东县| 宁海县| 涟源市| 黔江区| 浠水县| 安康市| 平凉市| 宁强县| 辰溪县| 西平县| 新闻| 增城市| 哈密市|