Python之numpy數組學習(五)——廣播

Python之numpy數組學習(五)——廣播

預備閱讀: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數組學習(五)——廣播

小結

今天學習一下Python中numpy數組的廣播。希望通過上面的操作能幫助大家。如果你有什麼好的意見,建議,或者有不同的看法,我都希望你留言和我們進行交流、討論。

歡迎關注,訪問更多精彩:AiryData。

如需轉載,請聯繫授權,謝謝合作。

相關推薦

推薦中...