import scipy.io.wavfile as wav
import matplotlib.pyplot as plt
import scipy
sample_rate, X = wav.read("/Users/sinaastani/Downloads/partynextdoor.wav")
X = scipy.mean(X, axis=1)
plt.specgram(X, Fs=sample_rate, xextent=(0,30))
我执行上述代码时遇到了错误:
/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/matplotlib/axes/_axes.py:7017: RuntimeWarning: divide by zero encountered in log10
Z = 10. * np.log10(spec)
这发生在我尝试过的多个wav文件中。我只是试图复制《使用Python构建机器学习系统-第二版》中的一个示例。
wavfile.read函数返回一个numpy数组。看起来在这个数组的开头和结尾有很多0值,所以当它尝试计算log(0)时,它是未定义的。应该如何处理?我应该简单地从数组中去掉0值吗?
nan
或您喜欢的最小正数,X[X == 0] = scipy.nan
或X[X == 0] = 1.e-18
。但是,我不确定这是否真的是问题所在。我故意将一些值设置为0
,但我尝试过的文件代码仍然可以正常运行。你的代码中哪一行产生了上述错误? - ImportanceOfBeingErnestplt.specgram(np.zeros(1000))
而不会出现错误。因此,数组中的零不能是错误的原因。nan
或inf
也不可能是错误的原因。 - ImportanceOfBeingErnest