NumPy 似乎缺乏对 3 字节和 6 字节类型(又名uint24
和uint48
. 我有一个使用这些类型的大型数据集,并希望将其提供给 numpy。我目前在做什么(对于 uint24):
import numpy as np
dt = np.dtype([('head', '<u2'), ('data', '<u2', (3,))])
# I would like to be able to write
# dt = np.dtype([('head', '<u2'), ('data', '<u3', (2,))])
# dt = np.dtype([('head', '<u2'), ('data', '<u6')])
a = np.memmap("filename", mode='r', dtype=dt)
# convert 3 x 2byte data to 2 x 3byte
# w1 is LSB, w3 is MSB
w1, w2, w3 = a['data'].swapaxes(0,1)
a2 = np.ndarray((2,a.size), dtype='u4')
# 3 LSB
a2[0] = w2 % 256
a2[0] <<= 16
a2[0] += w1
# 3 MSB
a2[1] = w3
a2[1] <<=8
a2[1] += w2 >> 8
# now a2 contains "uint24" matrix
虽然它适用于 100MB 的输入,但它看起来效率低下(想想 100s GB 的数据)。有没有更有效的方法?例如,创建一种特殊类型的只读视图来屏蔽部分数据会很有用(“具有两个 MSB 始终为零的 uint64”类型)。我只需要对数据进行只读访问。