5

次のコードを使用して、24 ビット バイナリdataを 16 ビットnumpy配列にロードします。

temp = numpy.zeros((len(data) / 3, 4), dtype='b')
temp[:, 1:] = numpy.frombuffer(data, dtype='b').reshape(-1, 3)
temp2 = temp.view('<i4').flatten() >> 16       # >> 16 because I need to divide by 2**16 to load my data into 16-bit array, needed for my (audio) application
output = temp2.astype('int16')

速度効率を改善することは可能だと思いますが、どのように?

4

2 に答える 2

1

@amaureaの回答に触発されたcythonバージョンを次に示します(元のコードですでにcythonを使用しているため、cython + fortranを混合する代わりにcythonを使用します):

import cython
import numpy as np
cimport numpy as np

def binary24_to_int16(char *data):
    cdef int i
    res = np.zeros(len(data)/3, np.int16)
    b = <char *>((<np.ndarray>res).data)
    for i in range(len(data)/3):
        b[2*i] = data[3*i+1]
        b[2*i+1] = data[3*i+2]
    return res            

ファクター4のスピードゲインがあります:)

于 2014-03-02T18:39:21.207 に答える