我有一个包含一些音频数据的numpy数组。我正在做一些处理,并希望用白噪声替换数据的某些部分。然而,噪音应该比更换部件短。生成噪声不是问题,但我想知道用噪声替换原始数据的最简单方法是什么。由于明显的尺寸不匹配,我第一次想到做data[10:110] = noise[0:10]
不起作用。
用不同维度的另一部分替换numpy数组的一部分最简单的方法是什么?
修改 数据是未压缩的PCM数据,可能长达一个小时,占用几百MB的内存。我想避免在内存中创建任何其他副本。
答案 0 :(得分:5)
numpy数组对于应用程序的python列表有什么优势?我认为numpy数组的一个弱点是它们不容易调整大小:
http://mail.python.org/pipermail/python-list/2008-June/1181494.html
你真的需要从缩短阵列的片段中回收内存吗?如果没有,也许你可以使用蒙面数组:
http://docs.scipy.org/doc/numpy/reference/maskedarray.generic.html
如果要用较短的噪声部分替换信号的一部分,请替换信号的第一个块,然后屏蔽掉已移除信号的其余部分。
编辑:这是一些笨重的numpy代码,不使用掩码数组,并且不分配更多内存。它也不会为已删除的段释放任何内存。想法是通过移动数组的其余部分来替换要删除的数据,在数组的末尾留下零(或垃圾)。import numpy
a = numpy.arange(10)
# [0 1 2 3 4 5 6 7 8 9]
## Replace a[2:7] with length-2 noise:
insert = -1 * numpy.ones((2))
new = slice(2, 4)
old = slice(2, 7)
#Just to indicate what we'll be replacing:
a[old] = 0
# [0 1 0 0 0 0 0 7 8 9]
a[new] = insert
# [0 1 -1 -1 0 0 0 7 8 9]
#Shift the remaining data over:
a[new.stop:(new.stop - old.stop)] = a[old.stop:]
# [0 1 -1 -1 7 8 9 7 8 9]
#Zero out the dangly bit at the end:
a[(new.stop - old.stop):] = 0
# [0 1 -1 -1 7 8 9 0 0 0]
答案 1 :(得分:0)
并不完全熟悉numpy,但是你不能将数据阵列分解为与噪声阵列大小相同的片段,并将每个数据片段设置为噪声片段。例如:
data[10:20] = noise[0:10]
data[21:31] = noise[0:10]
等等等?
你可以像这样循环:
for x in range(10,100,10):
data[x:10+x] = noise[0:10]
更新:
如果您想缩短原始数据数组,可以这样做:
data = data[:10] + noise[:10]
这将截断数据数组并将噪声添加到第10个位置之后的原始数组中,然后可以根据需要将其余的数据数组添加到新数组中。