Python 当数组既不为空也不损坏时,从音频文件构建的NumPy数组将抛出零大小数组错误
我的代码是:Python 当数组既不为空也不损坏时,从音频文件构建的NumPy数组将抛出零大小数组错误,python,arrays,numpy,wav,Python,Arrays,Numpy,Wav,我的代码是: import numpy from scipy.io.wavfile import read audio_file_location = 'file_location' audio_file = read(audio_file_location) n = numpy.array( audio_file[1],dtype=float ) size = n.size w = 410 limit = 205 delta = n.size/410 i = 0 j = 0 a = 1
import numpy
from scipy.io.wavfile import read
audio_file_location = 'file_location'
audio_file = read(audio_file_location)
n = numpy.array( audio_file[1],dtype=float )
size = n.size
w = 410
limit = 205
delta = n.size/410
i = 0
j = 0
a = 1
while i < w:
J = min(size, j+delta)
if J > j:
b = numpy.max( n[j:J] )
else:
break
# Do stuff
i = i+1
j = j+delta
if i >= limit:
# just something to stop the script.
# add a break point in the next line of code.
# and then run the top part of the script two or 3 times.
a = 1+a
其他NumPy阵列,例如:
numpy.array(range(0, 176942))
和其他音频文件工作正常。该错误与多个音频文件一起抛出,而不仅仅是一个
此错误的来源是什么?
我认为文件没有损坏。但如果是的话
如何检查/修复它?
注意:
File "<ipython-input-14-7d842d790860>", line 1, in <module>
runfile('.../Documents/wav_analizer/questoin_on_numpy.size.py', wdir='.../Documents/wav_analizer')
File ".../.local/lib/python2.7/site-packages/spyder/utils/site/sitecustomize.py", line 705, in runfile
execfile(filename, namespace)
File ".../.local/lib/python2.7/site-packages/spyder/utils/site/sitecustomize.py", line 94, in execfile
builtins.execfile(filename, *where)
File ".../Documents/wav_analizer/questoin_on_numpy.size.py", line 30, in <module>
b = numpy.max( n[j:J] )
File ".../.local/lib/python2.7/site-packages/numpy/core/fromnumeric.py", line 2320, in amax
out=out, **kwargs)
File ".../.local/lib/python2.7/site-packages/numpy/core/_methods.py", line 26, in _amax
return umr_maximum(a, axis, None, out, keepdims)
ValueError: zero-size array to reduction operation maximum which has no identity
当i>limit for limit=205、达到该极限后进行2次或3次迭代时,将发生错误。j和j的值可能因音频文件的长度而异。j和j值的示例为:197760、198720;和8878689217
完全回溯:
File "<ipython-input-14-7d842d790860>", line 1, in <module>
runfile('.../Documents/wav_analizer/questoin_on_numpy.size.py', wdir='.../Documents/wav_analizer')
File ".../.local/lib/python2.7/site-packages/spyder/utils/site/sitecustomize.py", line 705, in runfile
execfile(filename, namespace)
File ".../.local/lib/python2.7/site-packages/spyder/utils/site/sitecustomize.py", line 94, in execfile
builtins.execfile(filename, *where)
File ".../Documents/wav_analizer/questoin_on_numpy.size.py", line 30, in <module>
b = numpy.max( n[j:J] )
File ".../.local/lib/python2.7/site-packages/numpy/core/fromnumeric.py", line 2320, in amax
out=out, **kwargs)
File ".../.local/lib/python2.7/site-packages/numpy/core/_methods.py", line 26, in _amax
return umr_maximum(a, axis, None, out, keepdims)
ValueError: zero-size array to reduction operation maximum which has no identity
这就是错误的原因。但是,当我尝试解析N时,我遇到了一个索引问题:
import os
import numpy
from scipy.io.wavfile import read
working_dir = os.path.dirname(os.path.realpath(__file__))
audio_file_location = os.path.join(working_dir, 'test_sounds/guitarup_full.wav')
audio_file = read(audio_file_location)
delta_t = audio_file[0]
n = audio_file[1] # this is a numpy array
print "Size", n.size
print "Shape", n.shape
for i in range(0, n.size-1):
a = n[i][0]
b = n[i][1]
for i in range(0, n.shape[0]-1):
a = n[i][0]
b = n[i][1]
输出:
"Size" 176942
"Shape" (88471, 2)
/.local/lib/python2.7/site-packages/scipy/io/wavfile.py:273: WavFileWarning: Chunk (non-data) not understood, skipping it.
WavFileWarning)
Traceback (most recent call last):
File "<ipython-input-51-7d842d790860>", line 1, in <module>
runfile('/Documents/wav_analizer/questoin_on_numpy.size.py', wdir='/Documents/wav_analizer')
File "/.local/lib/python2.7/site-packages/spyder/utils/site/sitecustomize.py", line 705, in runfile
execfile(filename, namespace)
File "/.local/lib/python2.7/site-packages/spyder/utils/site/sitecustomize.py", line 94, in execfile
builtins.execfile(filename, *where)
File "/Documents/wav_analizer/questoin_on_numpy.size.py", line 26, in <module>
a = n[i][0]
IndexError: index 88471 is out of bounds for axis 0 with size 88471
“大小”176942
“形状”(88471,2)
/.local/lib/python2.7/site packages/scipy/io/wavfile.py:273:WavFileWarning:Chunk(非数据)未被理解,跳过它。
WAVFELE(警告)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
运行文件('/Documents/wav_analizer/questoin_on_numpy.size.py',wdir='/Documents/wav_analizer')
文件“/.local/lib/python2.7/site packages/spyder/utils/site/sitecustomize.py”,第705行,在runfile中
execfile(文件名、命名空间)
文件“/.local/lib/python2.7/site packages/spyder/utils/site/sitecustomize.py”,第94行,在execfile中
execfile(文件名,*其中)
文件“/Documents/wav_analizer/questoin_on_numpy.size.py”,第26行,在
a=n[i][0]
索引器:索引88471超出大小为88471的轴0的界限
为什么大小和形状之间存在差异?我猜,对于只有一个声道的声音文件,即单声道而非立体声,这是不可行的。在这种情况下,当您创建
n
数组时,您将获取通道的第一个元素,而不是整个第一个通道
您可以尝试以下方法:
if audio_file.ndims > 1:
audio_file = audio_file[1]
n = numpy.array(audio_file, dtype=float)
如果数据已经是一维的,请直接使用它。如果数据至少有两个通道,请按照代码中的方法使用第二个通道。解决方案:
File "<ipython-input-14-7d842d790860>", line 1, in <module>
runfile('.../Documents/wav_analizer/questoin_on_numpy.size.py', wdir='.../Documents/wav_analizer')
File ".../.local/lib/python2.7/site-packages/spyder/utils/site/sitecustomize.py", line 705, in runfile
execfile(filename, namespace)
File ".../.local/lib/python2.7/site-packages/spyder/utils/site/sitecustomize.py", line 94, in execfile
builtins.execfile(filename, *where)
File ".../Documents/wav_analizer/questoin_on_numpy.size.py", line 30, in <module>
b = numpy.max( n[j:J] )
File ".../.local/lib/python2.7/site-packages/numpy/core/fromnumeric.py", line 2320, in amax
out=out, **kwargs)
File ".../.local/lib/python2.7/site-packages/numpy/core/_methods.py", line 26, in _amax
return umr_maximum(a, axis, None, out, keepdims)
ValueError: zero-size array to reduction operation maximum which has no identity
我找到了解决办法。以下脚本有效:
import os
import scipy.io.wavfile
import numpy
audio_file_location = "your audio file location"
F = scipy.io.wavfile.read(audio_file_location)
delta_t = F[0]
N = F[1]
print "shape:", N.shape
print "dtype:", N.dtype
print "min, max:", N.min(), N.max()
print "first value:", N[0]
print ""
chennel_1 = numpy.zeros(N.size)
chennel_2 = numpy.zeros(N.size)
i = 0
for x in N:
chennel_1[i] = x[0]
chennel_2[i] = x[1]
i = i+1
i = 0
while i < 100:
print "ch_1", i, chennel_1[i]
print "ch_2", i, chennel_2[i]
i = i+1
导入操作系统
导入scipy.io.wav文件
进口numpy
音频文件位置=“您的音频文件位置”
F=scipy.io.wavfile.read(音频文件位置)
delta_t=F[0]
N=F[1]
打印“形状:”,N.形状
打印“数据类型:”,N.dtype
打印“最小,最大:”,N.min(),N.max()
打印“第一个值:”,N[0]
打印“”
chennel_1=numpy.零(N.尺寸)
chennel_2=numpy.零(N.尺寸)
i=0
对于N中的x:
chennel_1[i]=x[0]
chennel_2[i]=x[1]
i=i+1
i=0
当我<100时:
打印“Chu_1”,i,chennel_1[i]
打印“Chu 2”,i,chennel_2[i]
i=i+1
还是不明白形状和大小的差异。如果有人能解释,那就太好了。请包括完整的回溯。目前我们不知道是哪行代码引发了这个错误。这是Python 2还是Python 3?另外,请给我们足够的关于输入的信息来诊断这个问题。发生故障的阵列的大小或形状是什么?当它失败时,
J
和J
的值是多少?打印调试建议:在b=numpy.max(n[J:J])
之前添加行print(n.shape,J,J)
。当i>限制时会发生错误。j和j的值可能因音频文件的长度而异。j和j值的示例有:197760198720,但我已经到了:n=numpy.array(audio_file[1],dtype=float),区别是什么?我得到:AttributeError:“tuple”对象没有属性“ndims”。以上不是解决方案。请参阅:scipy.io.wavfile.read返回(int,numpy.array)My bad,我认为函数只返回数据。我认为错误的根源仍然是通道数,但我的修正是错误的。