如何创建包含 24 位整数的 Numpy dtype?
Posted
技术标签:
【中文标题】如何创建包含 24 位整数的 Numpy dtype?【英文标题】:How do I create a Numpy dtype that includes 24 bit integers? 【发布时间】:2012-08-22 19:41:06 【问题描述】:我有一个二进制文件,其记录结构为 400 个 24 位有符号大端整数,后跟一个 16 位大端有符号短整数。我想做的是这样的:
from numpy import dtype , fromfile
record_dtype = dtype([('samples','>i3',(400,)),('marker','>i2')])
data = fromfile('binary_file.dat',dtype=record_dtype)
不幸的是,我得到的是:
TypeError: data type not understood
响应“>i3”。如何定义 dtype 以读取 24 位二进制数?
【问题讨论】:
这是不可能的,另见:***.com/questions/11967339/… 我认为 3 字节整数很难得到。您可能需要将字节读取为字节,每第三个数字压缩一个 0 字节,然后在内部使用 4 字节整数......(猜测) 另见***.com/questions/11508010/… Sebastian 和 ecatmur 提供的链接可能与这个问题足够接近,因此这个问题也可以作为副本关闭。 (如果我有代表,我会投票。) 【参考方案1】:我有一个 24 位四通道 PCM 格式的 TB 文件。
除了一次想要的部分,我当然不想碰任何其他东西,所以我做了这样的事情:
import numpy as np
from numpy.lib.stride_tricks import as_strided
rawdatamap = np.memmap('4ch24bit800GBdatafile.pcm', dtype=np.dtype('u1'),mode='r')
# in case of a truncated frame at the end
usablebytes = rawdatamap.shape[0]-rawdatamap.shape[0]%12
frames = int(usablebytes/12)
rawbytes = rawdatamap[:usablebytes]
realdata = as_strided(rawbytes.view(np.int32), strides=(12,3,), shape=(frames,4))
someusefulpart = realdata[hugeoffset:hugeoffset+smallerthanram]&0x00ffffff
这从内存长度为smallerthanram
字节的文件中复制了一份。
注意字节掩码!您需要它来切掉 32 位字的最高有效字节 - 这将是属于前一个样本的垃圾。
您也可以像这样将其应用于单个数据:
scaled_ch2_datum_at_framenum = scalefactor*(realdata[framenum,1]&0x00ffffff)-shiftoffset
虽然有点乱,但目前还不错。
您实际上可能需要 64 位系统来执行此操作。
注意。这适用于小端数据。要处理大端,您将在视图中使用大端 dtype,并将 ...&0x00ffffff
替换为 ...&ffffff00>>8
【讨论】:
抱歉:字节掩码截取了 next 样本的一部分,而不是前一个。因为它是小端序,并且最重要的字节是我们不想要的第四个字节。 还有其他有趣的方式来(ab?)使用 stride in this lecture on advanced numpy 无论如何,这是一个非常好的答案,但我希望我能再给它一个正确使用“基准”一词的赞成票。以上是关于如何创建包含 24 位整数的 Numpy dtype?的主要内容,如果未能解决你的问题,请参考以下文章