我有一个100,000长的字节数组,其中每16位行是一个10位地址,而6位计数是连接在一起的。我想以一种数组有效的方式将16 x 100,000数组转换为两个单独的(地址和数据)数组。较短的运行时间对我的应用程序至关重要。
到目前为止,我有
f = open(curfile, mode="r")
aint = np.fromfile(f, dtype=np.uint16)
line = '{0:15b}'.format(aint[nn])
addr[nn] = 2**8*return0ifempty(line[0]) + return0ifempty(line[1:9])
count[nn] = line[-6:]
(输入''时return0ifempty返回0)
整个二进制=> uint16 =>二进制=> uint16的想法效率极低。必须有更好的方法来做到这一点。是否有任何方法可以像Matlab中那样截断数组,例如A(5:10,:)?
答案 0 :(得分:1)
假设您需要低10位和高6位:
low_10 = aint & 1023
high_6 = aint >> 10
如果要低6位,高10位:
low_6 = aint & 63
high_10 = aint >> 6
与Python循环不同,它是矢量化的,并且运行速度快得多(而且也没有转换为字符串)。
编辑:在您的示例中,您希望addr为10高,count为6低;所以...
count = aint & 63
addr = aint >> 6
对63
的一些解释:它是0b111111
,因此& 63
将保留6个低位并关闭任何高位。