預備閱讀:Python之numpy數組學習(一)Python之numpy數組學習(二)Python之numpy數組學習(三)Python之numpy數組學習(四)——索引和視圖
為獲得良好代碼體驗,建議查看原文。
前言
前面我們學習了numpy庫的很多知識,今天來學習下數組的廣播。
Numpy數組的廣播
當操作對象的形狀不一樣時,numpy會盡力進行處理。
假設一個數組要跟一個標量相乘,這時標量需要根據數組的形狀進行擴展,然後才可以執行乘法運算。這個擴展的過程叫做廣播(broadcasting)。
廣播的步驟如下:
①讀取WAV文件
(本地沒有找到好的直接下載WAV文件的網站,歡迎推薦)這裡我們使用標準Python代碼來下載《王牌大賤諜》中的歌曲Smashing,baby。Scipy中有一個wavfile子程序包,可以用來加載音頻數據,或者生成WAV格式的文件。如果此前已安裝了scipy,現在就可以直接用了。我們使用read()函數讀取文件,它返回一個數據陣列及採樣率,不過,我們這裡只對數據本身感興趣。
sample_rate, data = scipy.io.wavfile.read(WAV_FILE)
②繪製原WAV數據
這裡我們利用matplotlib繪製原始WAV數據,並用一個子圖來顯示標題“original”,代碼如下所示:
plt.subplot(2, 1, 1)
plt.title("Original")
plt.plot(data)
③新建一個數組
現在,我們要用numpy來生成一段“寂靜的”聲音。實際上,就是將原數組的值乘以一個常數,從而得到一個新數組,因為這個新數組的元素值肯定是變小了。這就是廣播技術的用武之地。最後,我們要確保新數組和原數組的類型一致,即WAV格式。
newdata = data * 0.2
newdata = newdata.astype(np.uint8)
④寫入一個WAV文件中。
將新數組保存到一個新的WAV文件中,代碼如下:
scipy.io.wavfile.write("quiet.wav",
sample_rate,newdata)
⑤繪製出新的WAV數據。
可以使用matplotlib來畫出新數組中數據,代碼如下:
plt.subplot(2, 1, 2)
plt.title("Quiet")
plt.plot(newdata)
plt.show()
⑥展現原始WAV數據圖像和新數組的圖像。
下面用完整代碼來說明一下:
#-*- coding:utf-8 -*-
import scipy.io.wavfile
import matplotlib.pyplot as plt
from urllib import request
import numpy as np
url = 'http://www.thesoundarchive.com/austinpowers/smashingbaby.wav'
response = request.urlopen(url)
print (response.info())
WAV_FILE = 'smashingbaby.wav'
#二進制方式打開
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)
#新數據
newdata = data * 0.2
newdata = 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()
小結
今天學習一下Python中numpy數組的廣播。希望通過上面的操作能幫助大家。如果你有什麼好的意見,建議,或者有不同的看法,我都希望你留言和我們進行交流、討論。
歡迎關注,訪問更多精彩:AiryData。
如需轉載,請聯繫授權,謝謝合作。