用较短的数组替换部分numpy 1D数组

时间:2010-12-20 15:19:12

标签: python arrays numpy

我有一个包含一些音频数据的numpy数组。我正在做一些处理,并希望用白噪声替换数据的某些部分。然而,噪音应该比更换部件短。生成噪声不是问题,但我想知道用噪声替换原始数据的最简单方法是什么。由于明显的尺寸不匹配,我第一次想到做data[10:110] = noise[0:10]不起作用。

用不同维度的另一部分替换numpy数组的一部分最简单的方法是什么?

修改 数据是未压缩的PCM数据,可能长达一个小时,占用几百MB的内存。我想避免在内存中创建任何其他副本。

2 个答案:

答案 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个位置之后的原始数组中,然后可以根据需要将其余的数据数组添加到新数组中。