2014-02-09 44 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') 

它工作得很好,但:有没有更快的解决方案?(这里我使用:字符串缓冲区,int32中的1个数组,int16中的1个数组;我想知道是否可以保存一个步骤)

回答

2

这个怎么样?

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

但是请注意,这里描述的那种开销在使用numpy时很常见,并且不能总是避免。如果这种开销不适合您的应用程序,请确保您提前计划为性能关键部分编写扩展模块。

注意:它应该是0 :: 2或1 :: 2,具体取决于您的平台的字节顺序

+0

谢谢。 这是一个来自大型阵列的“视角”吗? (即所有的32位数组将保持存储在存储器中)。 看来最终的'int16'数组不会有连续的数据。 – Basj

+0

是的,这将是一个看法。如果需要连续性,则可以使用np.ascontiguousarray,这将生成副本。这应该仍然比按位操作和演员快;它只有一个通过阵列。 –

+0

它会是'np.ascontiguousarray(np.fromstring(data,dtype = np.uint16)[0 :: 2])''吗? 顺便说一下,你会用什么样的profiler工具/命令来比较速度? (也许你有一个例子?) – Basj