網(wǎng)站性能檢測(cè)評(píng)分
注:本網(wǎng)站頁(yè)面html檢測(cè)工具掃描網(wǎng)站中存在的基本問(wèn)題,僅供參考。
python中的numpy
Python之numpy數(shù)組學(xué)習(xí)(二) 推廣視頻課程
前言
前面我們學(xué)習(xí)了numpy庫(kù)的簡(jiǎn)單應(yīng)用,今天來(lái)學(xué)習(xí)下比較重要的如何處理數(shù)組。
處理數(shù)組形狀
下面可將多維數(shù)組轉(zhuǎn)換成一維數(shù)組時(shí)的情形。
利用以下函數(shù)處理數(shù)組的形狀:
拆解:ravel()函數(shù)可將多維數(shù)組變成一維數(shù)組。拉直(Flatten):flatten()函數(shù)與ravel()相同,但是,flatten()返回的是真實(shí)的數(shù)組,需要分配新的內(nèi)存空間;而ravel()函數(shù)返回的只是數(shù)組的視圖。用元組指定數(shù)組形狀:除reshape()函數(shù)外,還可以用元組來(lái)定義數(shù)組的形狀。轉(zhuǎn)置:在線(xiàn)性代數(shù)中,矩陣的轉(zhuǎn)置操作非常常見(jiàn),轉(zhuǎn)置是一種數(shù)據(jù)變換方法,對(duì)于二維表而言,轉(zhuǎn)置就意味著行變成列,同時(shí)列變成行。調(diào)整大?。汉瘮?shù)resize()的作用類(lèi)似于reshape(),但是會(huì)改變所作用的數(shù)組。
堆疊數(shù)組
從深度看,數(shù)組既可以橫向疊放,也可以豎向疊放。因此,可以使用vstack()、dstack()、hstack()、column_stack()、row_stack()、和concatenate()等函數(shù)。
首先我們要建立一些數(shù)組,然后整體說(shuō)一下各種疊加方式,最后放上示例代碼:
水平疊加:先介紹水平疊加方式,即用元組確定ndarrays()數(shù)組的形狀,然后交由hstack()函數(shù)來(lái)碼放這些數(shù)組。垂直疊加:使用垂直疊加方法,先要構(gòu)建一個(gè)元組,然后將元組交給vstack()函數(shù)來(lái)碼放數(shù)組。深度疊加:還有一種深度疊加方法,這要用到dstack()函數(shù)和一個(gè)元組。這種方法是沿著第三個(gè)坐標(biāo)軸(縱向)的方法來(lái)疊加一摞數(shù)組。舉例來(lái)說(shuō):可以在一個(gè)圖像數(shù)據(jù)的二維數(shù)組上疊加另一幅圖像的數(shù)據(jù)。列式堆疊:column_stack()函數(shù)以列方式對(duì)一維數(shù)組進(jìn)行堆疊。行式堆疊:同時(shí),numpy也有以行方式對(duì)數(shù)組進(jìn)行堆疊的函數(shù),這個(gè)用于一維數(shù)組的函數(shù)名為row_stack(),它將數(shù)組作為行碼放到二維數(shù)組中。
整體代碼如下:
#-*- coding:utf-8 -*-#stacking.pyimport numpy as np#創(chuàng)建數(shù)組a = np.arange(9).reshape(3,3)print(a)#Out:#array([[0, 1, 2],# [3, 4, 5],# [6, 7, 8]])b = 2 * aprint (b)#Out:#array([[ 0, 2, 4],# [ 6, 8, 10],# [12, 14, 16]])#水平疊加print (np.hstack((a, b)))#Out:#array([[ 0, 1, 2, 0, 2, 4],# [ 3, 4, 5, 6, 8, 10],# [ 6, 7, 8, 12, 14, 16]])print (np.concatenate((a, b), axis=1))#Out:#array([[ 0, 1, 2, 0, 2, 4],# [ 3, 4, 5, 6, 8, 10],# [ 6, 7, 8, 12, 14, 16]])#垂直疊加print (np.vstack((a, b)))#Out:#array([[ 0, 1, 2],# [ 3, 4, 5],# [ 6, 7, 8],# [ 0, 2, 4],# [ 6, 8, 10],# [12, 14, 16]])print (np.concatenate((a, b), axis=0))#Out:#array([[ 0, 1, 2],# [ 3, 4, 5],# [ 6, 7, 8],# [ 0, 2, 4],# [ 6, 8, 10],# [12, 14, 16]])#深度疊加print (np.dstack((a, b)))#Out:#array([[[ 0, 0],# [ 1, 2],# [ 2, 4]],# [[ 3, 6],# [ 4, 8],# [ 5, 10]],# [[ 6, 12],# [ 7, 14],# [ 8, 16]]])oned = np.arange(2)print (oned)#Out: array([0, 1])twice_oned = 2 * onedprint (twice_oned)#Out: array([0, 2])print (np.column_stack((oned, twice_oned)))#Out:#array([[0, 0],# [1, 2]])print (np.column_stack((a, b)))#Out:#array([[ 0, 1, 2, 0, 2, 4],# [ 3, 4, 5, 6, 8, 10],# [ 6, 7, 8, 12, 14, 16]])#數(shù)組對(duì)比print (np.column_stack((a, b)) == np.hstack((a, b)))#Out:#array([[ True, True, True, True, True, True],# [ True, True, True, True, True, True],# [ True, True, True, True, True, True]], dtype=bool)#列式堆疊print (np.row_stack((oned, twice_oned)))#Out:#array([[0, 1],# [0, 2]])print (np.row_stack((a, b)))#Out:#array([[ 0, 1, 2],# [ 3, 4, 5],# [ 6, 7, 8],# [ 0, 2, 4],# [ 6, 8, 10],# [12, 14, 16]])print (np.row_stack((a,b)) == np.vstack((a, b)))#Out:#array([[ True, True, True],# [ True, True, True],# [ True, True, True],# [ True, True, True],# [ True, True, True],# [ True, True, True]], dtype=bool)
小結(jié)
今天學(xué)習(xí)一下Python中numpy的堆疊數(shù)組。希望通過(guò)上面的操作能幫助大家。如果你有什么好的意見(jiàn),建議,或者有不同的看法,我都希望你留言和我們進(jìn)行交流、討論。
Python之numpy數(shù)組學(xué)習(xí)(五)——廣播 企業(yè)視頻課程
預(yù)備閱讀:Python之numpy數(shù)組學(xué)習(xí)(一)Python之numpy數(shù)組學(xué)習(xí)(二)Python之numpy數(shù)組學(xué)習(xí)(三)Python之numpy數(shù)組學(xué)習(xí)(四)——索引和視圖
為獲得良好代碼體驗(yàn),建議查看原文。
前言
前面我們學(xué)習(xí)了numpy庫(kù)的很多知識(shí),今天來(lái)學(xué)習(xí)下數(shù)組的廣播。
Numpy數(shù)組的廣播
當(dāng)操作對(duì)象的形狀不一樣時(shí),numpy會(huì)盡力進(jìn)行處理。
假設(shè)一個(gè)數(shù)組要跟一個(gè)標(biāo)量相乘,這時(shí)標(biāo)量需要根據(jù)數(shù)組的形狀進(jìn)行擴(kuò)展,然后才可以執(zhí)行乘法運(yùn)算。這個(gè)擴(kuò)展的過(guò)程叫做廣播(broadcasting)。
廣播的步驟如下:
①讀取WAV文件
(本地沒(méi)有找到好的直接下載WAV文件的網(wǎng)站,歡迎推薦)這里我們使用標(biāo)準(zhǔn)Python代碼來(lái)下載《王牌大賤諜》中的歌曲Smashing,baby。Scipy中有一個(gè)wavfile子程序包,可以用來(lái)加載音頻數(shù)據(jù),或者生成WAV格式的文件。如果此前已安裝了scipy,現(xiàn)在就可以直接用了。我們使用read()函數(shù)讀取文件,它返回一個(gè)數(shù)據(jù)陣列及采樣率,不過(guò),我們這里只對(duì)數(shù)據(jù)本身感興趣。
sample_rate, data = scipy.io.wavfile.read(WAV_FILE)
②繪制原WAV數(shù)據(jù)
這里我們利用matplotlib繪制原始WAV數(shù)據(jù),并用一個(gè)子圖來(lái)顯示標(biāo)題“original”,代碼如下所示:
plt.subplot(2, 1, 1)plt.title("Original")plt.plot(data)
③新建一個(gè)數(shù)組
現(xiàn)在,我們要用numpy來(lái)生成一段“寂靜的”聲音。實(shí)際上,就是將原數(shù)組的值乘以一個(gè)常數(shù),從而得到一個(gè)新數(shù)組,因?yàn)檫@個(gè)新數(shù)組的元素值肯定是變小了。這就是廣播技術(shù)的用武之地。最后,我們要確保新數(shù)組和原數(shù)組的類(lèi)型一致,即WAV格式。
newdata = data * 0.2
newdata = newdata.astype(np.uint8)
④寫(xiě)入一個(gè)WAV文件中。
將新數(shù)組保存到一個(gè)新的WAV文件中,代碼如下:
scipy.io.wavfile.write("quiet.wav",sample_rate,newdata)
⑤繪制出新的WAV數(shù)據(jù)。
可以使用matplotlib來(lái)畫(huà)出新數(shù)組中數(shù)據(jù),代碼如下:
plt.subplot(2, 1, 2)plt.title("Quiet")plt.plot(newdata)plt.show()
⑥展現(xiàn)原始WAV數(shù)據(jù)圖像和新數(shù)組的圖像。
下面用完整代碼來(lái)說(shuō)明一下:
#-*- coding:utf-8 -*-import scipy.io.wavfileimport matplotlib.pyplot as pltfrom urllib import requestimport numpy as npurl = 'http://thesoundarchive/austinpowers/smashingbaby.wav'response = request.urlopen(url)print (response.info())WAV_FILE = 'smashingbaby.wav'#二進(jìn)制方式打開(kāi)filehandle = open(WAV_FILE, 'wb+')filehandle.write(response.read())filehandle.close()sample_rate, data = scipy.io.wavfile.read(WAV_FILE)print ("Data type", data.dtype,"--", "Shape", data.shape)#原始圖plt.subplot(2, 1, 1)plt.title("Original")plt.plot(data)#新數(shù)據(jù)newdata = data * 0.2newdata = newdata.astype(np.uint8)print ("Data type", newdata.dtype,"--", "Shape", newdata.shape)scipy.io.wavfile.write("quiet.wav",sample_rate, newdata)#新圖像plt.subplot(2, 1, 2)plt.title("Quiet")plt.plot(newdata)plt.show()
小結(jié)
今天學(xué)習(xí)一下Python中numpy數(shù)組的廣播。希望通過(guò)上面的操作能幫助大家。如果你有什么好的意見(jiàn),建議,或者有不同的看法,我都希望你留言和我們進(jìn)行交流、討論。
Python之numpy數(shù)組學(xué)習(xí)(四)——索引和視圖 互聯(lián)網(wǎng)視頻課程
預(yù)備閱讀:Python之numpy數(shù)組學(xué)習(xí)(一)Python之numpy數(shù)組學(xué)習(xí)(二)Python之numpy數(shù)組學(xué)習(xí)(三)
為獲得良好代碼體驗(yàn),建議查看原文。
前言
前面我們學(xué)習(xí)了numpy庫(kù)的簡(jiǎn)單應(yīng)用和數(shù)組的處理,今天來(lái)學(xué)習(xí)下數(shù)組的視圖和索引。
創(chuàng)建數(shù)組的視圖和拷貝
在學(xué)習(xí)ravel()函數(shù)的時(shí)候,我看到了視圖的概念,這讓我很驚訝,但是注意,這里的視圖和數(shù)據(jù)庫(kù)中的視圖不是一樣的。在numpy中,視圖不是只讀的。關(guān)鍵在于,當(dāng)前處理的是共享的數(shù)組視圖,還是數(shù)組數(shù)據(jù)的副本。舉例來(lái)說(shuō),可以取數(shù)組的一部分來(lái)生成視圖,這意味著,如果先將數(shù)組的某部分賦值給一個(gè)變量,然后修改原數(shù)組中相應(yīng)位置的數(shù)據(jù),那么這個(gè)變量的值也會(huì)隨之變化。
這里,我們通過(guò)動(dòng)物面部照片(face)照片來(lái)創(chuàng)建數(shù)組,然后創(chuàng)建視圖,隨后修改。這里的動(dòng)物面部照片的數(shù)組是從Scipy函數(shù)獲得。
看一下代碼和效果圖如下:
#-*- coding:utf-8 -*-import scipy.miscimport matplotlib.pyplot as plt#創(chuàng)建圖片數(shù)組face = scipy.misc.face()print (face.shape)#副本acopy = face.copy()#創(chuàng)建視圖aview = face.view()# 展示照片數(shù)組plt.subplot(221)plt.imshow(face)#展示照片數(shù)據(jù)副本plt.subplot(222)plt.imshow(acopy)#展示視圖plt.subplot(223)plt.imshow(aview)# 展示改變后的aview.flat = 0plt.subplot(224)plt.imshow(aview)plt.show()
可以看到,只有一副圖片可以看到該動(dòng)物圖片,如上圖所示。
同樣可以看到,程序最后修改了視圖,同時(shí)改變了原來(lái)的照片數(shù)組,這導(dǎo)致3副圖片全部變黑。而復(fù)制的數(shù)組沒(méi)有變化。所以,要記?。簄umpy中,視圖不是只讀的。
Numpy的索引
1、花式索引
花式索引是一種傳統(tǒng)的索引方法,它不使用整數(shù)或者切片。這里,我們將利用花式索引來(lái)把動(dòng)物圖片(face)對(duì)角線(xiàn)上的值全部置0,相當(dāng)于沿著兩條交叉的對(duì)角線(xiàn)畫(huà)兩條黑線(xiàn)。
看一下完整代碼和效果。
#-*- coding:utf-8 -*-import scipy.miscimport matplotlib.pyplot as plt# 加載圖片數(shù)組face = scipy.misc.face()'''這里說(shuō)明一下,默認(rèn)是正方形的圖片,如果不是,則需要xmax和ymax的值一樣大小。(PS.Python3.6中scipy的圖片規(guī)格變成了768*1024)'''xmax = face.shape[0]ymax = face.shape[0]#ymax = face.shape[1]報(bào)錯(cuò),#IndexError: shape mismatch: indexingarrays could not be broadcast together with shapes (768,) (1024,)# 設(shè)置對(duì)角線(xiàn)的值為0# x 0-xmax# y 0-ymaxface[range(xmax), range(ymax)] = 0# 設(shè)置另一條對(duì)角線(xiàn)的值為0# x xmax-0# y 0-ymaxface[range(xmax-1,-1,-1), range(ymax)] = 0# 展示效果plt.imshow(face)plt.show()
2、基于位置列表的索引方法
下面利用ix_()函數(shù)將動(dòng)物圖片的像素完全打亂。這個(gè)函數(shù)可以根據(jù)多個(gè)序列生成一個(gè)網(wǎng)格,它需要一個(gè)一維序列作為參數(shù),并返回一個(gè)由numpy數(shù)組構(gòu)成的元組。
利用位置列表索引numpy數(shù)組的過(guò)程如下:
①打亂數(shù)組的索引。用numpy.random子程序包中的shuffle()函數(shù)把數(shù)組中的元素按隨機(jī)的索引號(hào)重新排列,使數(shù)組產(chǎn)生相應(yīng)的變化。
②使用代碼畫(huà)出打亂后的索引。
③照片的像素被完全打亂后,展示效果。
代碼和效果如下圖所示:
#-*- coding:utf-8 -*-import scipy.miscimport matplotlib.pyplot as pltimport numpy as np# 加載圖片數(shù)組face = scipy.misc.face()xmax = face.shape[0]ymax = face.shape[1]#打亂數(shù)組的索引def shuffle_indices(size):arr = np.arange(size)np.random.shuffle(arr)return arrxindices = shuffle_indices(xmax)np.testing.assert_equal(len(xindices), xmax)yindices = shuffle_indices(ymax)np.testing.assert_equal(len(yindices), ymax)# 重畫(huà)打亂后的索引plt.imshow(face[np.ix_(xindices, yindices)])plt.show()
3、用布爾型變量索引numpy數(shù)組
布爾型索引是指根據(jù)布爾型數(shù)組來(lái)索引元素的方法,屬于花式索引系列。因?yàn)椴紶栃退饕腔ㄊ剿饕囊粋€(gè)分類(lèi),所以它們的使用方法基本相同。
下面看代碼和效果展示。
#-*- coding:utf-8 -*-import scipy.miscimport matplotlib.pyplot as pltimport numpy as np# 加載圖片數(shù)組face = scipy.misc.face()#在對(duì)角線(xiàn)上畫(huà)點(diǎn)def get_indices(size):arr = np.arange(size)return arr % 4 == 0# 僅繪畫(huà)出選定的點(diǎn)face1 = face.copy()xindices = get_indices(face.shape[0])yindices = get_indices(face.shape[0])#因?yàn)閳D片大小不是正方形,這里截取正方形圖片face1[xindices, yindices] = 0plt.subplot(211)plt.imshow(face1)face2 = face.copy()#選取數(shù)組值介于最大值的1/4到3/4的元素,將其置0face2[(face > face.max()/4) & (face plt.subplot(212)plt.imshow(face2)#展示效果plt.show()
小結(jié)
今天學(xué)習(xí)一下Python中numpy數(shù)組的視圖和索引。希望通過(guò)上面的操作能幫助大家。如果你有什么好的意見(jiàn),建議,或者有不同的看法,我都希望你留言和我們進(jìn)行交流、討論。
Python之numpy數(shù)組學(xué)習(xí)(一) 互聯(lián)網(wǎng)視頻課程
我回來(lái)了。
前言
前面已經(jīng)安裝并學(xué)習(xí)了Python中的科學(xué)計(jì)算庫(kù),今天主要學(xué)習(xí)下numpy數(shù)組。
Numpy數(shù)組對(duì)象
Numpy中的多維數(shù)組稱(chēng)為ndarray,它有兩個(gè)組成部分。
數(shù)據(jù)本身。描述數(shù)據(jù)的元數(shù)據(jù)。
在數(shù)組的處理過(guò)程中,原始數(shù)據(jù)不受影響,變化的只是元數(shù)據(jù)。
Numpy數(shù)組通常是由相同種類(lèi)的元素組成,即數(shù)組中數(shù)據(jù)類(lèi)型必須一致。好處是:數(shù)組元素類(lèi)型相同,可輕松確定存儲(chǔ)數(shù)組所需的空間大小。同時(shí),numpy可運(yùn)用向量化運(yùn)算來(lái)處理整個(gè)數(shù)組。Numpy數(shù)組的索引從0開(kāi)始。(這里我使用的是ipython命令行,ipython最近剛開(kāi)始用,以后詳細(xì)介紹下。)
In[3]:importnumpyasnpIn[4]:a=np.arange(5)In[5]:a.dtypeOut[5]:dtype('int32')
上面數(shù)組的數(shù)據(jù)類(lèi)型為int32,這一般跟你安裝的Python版本有關(guān)。不過(guò)我安裝的是64位,不知道怎么回事這里是int32,后面再檢查下。
上一篇我們說(shuō)了向量(一維的numpy數(shù)組)的創(chuàng)建方法,下面看一下上面生成的向量。
In[6]:aOut[6]:array([0,1,2,3,4])In[7]:a.shapeOut[7]:(5,)
可以看到,該向量有5個(gè)元素,該數(shù)組的shape屬性是一個(gè)元組,存放的是數(shù)組在每一個(gè)維度的長(zhǎng)度。
創(chuàng)建多維數(shù)組
我們已經(jīng)知道了如何創(chuàng)建向量,下面開(kāi)始建立多維numpy數(shù)組,生成矩陣后,再看它的形狀。
In[8]:m=np.array([np.arange(2),np.arange(2)])In[9]:mOut[9]:array([[0,1],[0,1]])
上面我們用arrange方法創(chuàng)建了一個(gè)簡(jiǎn)單的2*2的數(shù)組,利用array()函數(shù)創(chuàng)建數(shù)組時(shí),需要傳遞給它一個(gè)對(duì)象,并且這個(gè)對(duì)象必須是數(shù)組類(lèi)型。如Python的列表。
創(chuàng)建之后,我們要選擇矩陣的元素,這里就相當(dāng)于一個(gè)二維坐標(biāo)系,我們只要找到對(duì)應(yīng)的坐標(biāo)即可。
In[10]:m[0,0]Out[10]:0In[11]:m[0,1]Out[11]:1In[12]:m[1,0]Out[12]:0In[13]:m[1,1]Out[13]:1
可以看到,選擇數(shù)組元素很簡(jiǎn)單,對(duì)于數(shù)組m,只要通過(guò)m[m,n]的形式,就能訪問(wèn)數(shù)組內(nèi)的元素,其中m和n為數(shù)組元素的下標(biāo),從0開(kāi)始。
Numpy的數(shù)值類(lèi)型
Python本身支持整型、浮點(diǎn)型和復(fù)數(shù)型,為了科學(xué)計(jì)算,numpy提供了更加豐富的數(shù)據(jù)類(lèi)型,注意:numpy跟數(shù)學(xué)運(yùn)算有關(guān)的數(shù)據(jù)類(lèi)型的名稱(chēng)都以數(shù)字結(jié)尾。這個(gè)數(shù)字指示了該類(lèi)型的變量所占用的二進(jìn)制位數(shù)。Numpy的各種數(shù)值類(lèi)型如下圖所示:
每一種數(shù)據(jù)類(lèi)型都有相應(yīng)的轉(zhuǎn)換函數(shù),許多函數(shù)都帶有一個(gè)指定數(shù)據(jù)類(lèi)型的參數(shù),該參數(shù)一般可選。
In[15]:np.float64(30)Out[15]:30.0In[16]:np.bool(30)Out[16]:TrueIn[17]:np.float(True)Out[17]:1.0In[18]:np.int8(30)Out[18]:30In[20]:np.arange(7,dtype='uint16')Out[20]:array([0,1,2,3,4,5,6],dtype=uint16)
注意:不允許把復(fù)數(shù)轉(zhuǎn)化成整型。也不允許把復(fù)數(shù)轉(zhuǎn)化為浮點(diǎn)數(shù),但是允許把浮點(diǎn)數(shù)轉(zhuǎn)化為復(fù)數(shù)。復(fù)數(shù)的實(shí)部和虛部分別使用real()函數(shù)和imag()函數(shù)提取。
數(shù)據(jù)類(lèi)型對(duì)象是numpy.dtype類(lèi)的實(shí)例。數(shù)組是一種數(shù)據(jù)類(lèi)型。數(shù)據(jù)類(lèi)型對(duì)象表明了數(shù)據(jù)占用的字節(jié)數(shù),所占用字節(jié)的具體數(shù)目一般存放在類(lèi)dtype的itemsize中。
In[6]:importnumpyasnpIn[7]:a=np.arange(5)In[8]:aOut[8]:array([0,1,2,3,4])In[9]:a.dtype.itemsizeOut[9]:4
一維數(shù)組的切片和索引
一維numpy數(shù)組的切片操作和Python列表的切片一樣,看一下下面的例子來(lái)體驗(yàn)一下。
In[34]:a=np.arange(9)In[35]:aOut[35]:array([0,1,2,3,4,5,6,7,8])#通過(guò)下標(biāo)取數(shù)據(jù)In[36]:a[3:7]Out[36]:array([3,4,5,6])#用下標(biāo)選擇元素,范圍0到7,下標(biāo)每次遞增2In[37]:a[:7:2]Out[37]:array([0,2,4,6])#反轉(zhuǎn)數(shù)組In[38]:a[::-1]Out[38]:array([8,7,6,5,4,3,2,1,0])
小結(jié)
今天學(xué)習(xí)一下Python中numpy的簡(jiǎn)單使用。希望通過(guò)上面的操作能幫助大家。如果你有什么好的意見(jiàn),建議,或者有不同的看法,我都希望你留言和我們進(jìn)行交流、討論。