2014-02-09 7 views
0

Я прочитал (INT) 32 бит аудио data (с учетом как строки с помощью предыдущих команд) в numpy.int32 массив с:Быстрое преобразование из строки в массив numpy.int16

myarray = numpy.fromstring(data, dtype=numpy.int32) 

Но тогда я хочу сохранить его в память, как int16 (я знаю, что это уменьшит бит глубины/разрешение/качество звука):

myarray = myarray >> 16 
my_16bit_array = myarray.astype('int16') 

это работает очень хорошо, но: есть быстрее решение? (здесь я использую: строковый буфер, 1 массив в int32, 1 массив в int16, я хотел знать, можно ли сохранить один шаг)

ответ

2

Как насчет этого?

np.fromstring(data, dtype=np.uint16)[0::2] 

Однако обратите внимание, что накладные расходы типа вы описываете здесь часто при работе с NumPy, и не всегда можно избежать. Если этот вид накладных расходов неприемлем для вашего приложения, убедитесь, что вы планируете заранее написать модули расширения для критически важных компонентов.

Примечание: оно должно быть 0: 2 или 1: 2 в зависимости от консистенции вашей платформы.

+0

Спасибо. Будет ли это «вид» из большого массива numpy? (то есть весь 32-битный массив останется сохраненным в памяти). Кажется, что последний массив 'int16' не будет иметь смежных данных. – Basj

+0

Да, это будет вид. np.ascontiguousarray можно использовать, если требуется соприкосновение, которое сделает копию. Это должно быть быстрее, чем побитовое действие и бросок; его единственный проход по массиву. –

+0

Было бы что-то вроде 'np.ascontiguousarray (np.fromstring (data, dtype = np.uint16) [0: 2])'? Кстати, какой инструмент/команда профилировщика вы использовали бы здесь для сравнения скорости? (может быть, у вас есть пример?) – Basj

Смежные вопросы