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 の入力に対しては機能しますが、効率が悪いように見えます (100 GB のデータを考えてみてください)。より効率的な方法はありますか?たとえば、データの一部をマスクする特別な種類の読み取り専用ビューを作成すると便利です (「2 つの MSB が常にゼロの uint64」タイプのようなもの)。データへの読み取り専用アクセスのみが必要です。