Заменить часть массива 1D на более короткий массив - PullRequest
1 голос
/ 20 декабря 2010

У меня есть 1D-массив, содержащий некоторые аудиоданные. Я делаю некоторую обработку и хочу заменить некоторые части данных белым шумом. Однако шум должен быть короче заменяемой детали. Генерация шума не является проблемой, но мне интересно, как проще всего заменить исходные данные шумом. Моя первая мысль о data[10:110] = noise[0:10] не работает из-за очевидного несоответствия размеров.

Какой самый простой способ заменить часть массива numpy другой частью другого измерения?

редактирование: Данные представляют собой несжатые данные PCM, которые могут занимать до часа, занимая несколько сотен МБ памяти. Я хотел бы избежать создания дополнительных копий в памяти.

Ответы [ 2 ]

5 голосов
/ 20 декабря 2010

Какое преимущество имеет массив numpy над списком python для вашего приложения?Я думаю, что одним из недостатков массивов numpy является то, что их нелегко изменить размер:

http://mail.python.org/pipermail/python-list/2008-June/1181494.html

Вам действительно нужно восстановить память из сегментов массива, который выукорочение?Если нет, возможно, вы можете использовать маскированный массив:

http://docs.scipy.org/doc/numpy/reference/maskedarray.generic.html

Если вы хотите заменить часть вашего сигнала более короткой частью шума, замените первый фрагмент сигнала, затем замаскируйте оставшуюся часть удаленного сигнала.

РЕДАКТИРОВАТЬ: Вот некоторый неуклюжий код, который не использует замаскированные массивы и не выделяет больше памяти.Это также не освобождает память для удаленных сегментов.Идея состоит в том, чтобы заменить данные, которые вы хотите удалить, сместив оставшуюся часть массива, оставив нули (или мусор) в конце массива.

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]
0 голосов
/ 20 декабря 2010

не совсем знаком с 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-го местоположения, затем вы можете добавить остальную часть массива данных в новый массив, если вам это нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...