一个numpy函数将字节序列(具有相等长度)的列表(元组)转换为numpy.ndarray

vuktfyat  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(152)

在一个数据处理任务中,我需要将一个巨大的字节元组列表转换为一个数字numpy.ndarray。该列表的长度为over 10 Millions,由包含3个450字节序列的元组组成,如下图所示

[
    (
        b'\n\x0f\n\t\x0c\x00\x00\x01\x07\x06...', # 450 bytes series
        b'\x00\x0e\x00\x06\x07\x0c\n\x0e\x07...', # also 450 bytes
        b'\x05\x0e\x07\t\x04\x01\x05\x07\x08...',
    ), # 3-byte-serie tuple
    (...), # more tuples like this
    ... # the number of tuples is up to 10M
]

字符串
我希望得到的是一个numpy.uint8数组,其形状为(10Ms,3,450),其中每个uint8元素对应于序列中的一个字节(例如b'\n\x0f\n\t'到[10,15,10,9])。
或者简单地说,我在寻找一个与元素numpy.ndarray.tobytes相反的函数
当然,这可以通过在raw python中使用for编写一个简单的迭代来实现,用numpy.fromiter逐个将字节序列转换为一维数组。但是由于数据量巨大,我希望使用numpy来尽可能地加速这个过程。所以我想要的是一个直接的numpy函数,或者用几个numpy函数编写代码,而不需要任何raw python for迭代。
我也尝试过将合并numpy.fromiternp.frompyfunc结合起来,并在np.array(..., dtype = object)生成的numpy字节数组上使用它,但它似乎仍然不够快。

7rtdyuoh

7rtdyuoh1#

np.frombuffer可能就是你要找的:

import numpy as np

data = [
    (
        b'\n\x0f\n\t\x0c\x00\x00\x01\x07\x06', # 450 bytes series
        b'\x00\x0e\x00\x06\x07\x0c\n\x0e\x07', # also 450 bytes
        b'\x05\x0e\x07\t\x04\x01\x05\x07\x08',
    ),
    (
        b'\n\x0f\n\t\x0c\x00\x00\x01\x07\x06', # 450 bytes series
        b'\x00\x0e\x00\x06\x07\x0c\n\x0e\x07', # also 450 bytes
        b'\x05\x0e\x07\t\x04\x01\x05\x07\x08',
    ), # 3-byte-serie tuple
]

data_flat = np.array(data, dtype=np.bytes_).reshape(-1)
np.frombuffer(data_flat, dtype=np.uint8).reshape(2, 3, 10)

字符串
我希望这对你有帮助!

相关问题