从压缩字节加载 numpy 数组

Posted

技术标签:

【中文标题】从压缩字节加载 numpy 数组【英文标题】:Load numpy arrays from compressed bytes 【发布时间】:2019-11-21 09:59:28 【问题描述】:

我正在尝试将一堆 numpy 数组保存(使用 savez_compressed)到 BytesIO 对象中,然后将它们加载回变量中。到目前为止,我可以使用以下代码保存数组

# Arrays
a = numpy.random.uniform(size=(10,10)) # dtype is float64
b = numpy.random.uniform(size=(10,10)) # dtype is float64

# Create bytes object
buf = io.BytesIO()

# Save the arrays into the buffer
numpy.savez_compressed(buf, a=a, b=b)

# Closed the buffer
buf.close()

我一直在尝试不同的方法来加载它们。例如

ab = numpy.frombuffer(buf.read(), dtype='float64')

引发ValueError: buffer size must be a multiple of element size。并尝试像文件一样加载

ab = numpy.load(buf)

引发ValueError: Cannot load file containing pickled data when allow_pickle=False,当buf.read() 我得到ValueError: embedded null byte

【问题讨论】:

顺便说一句。要关闭缓冲区,您应该使用buf.close(),而不是buf.seek() 【参考方案1】:

以下对我有用 [Numpy version: numpy==1.16.1]:

import numpy
import io

# Arrays
a = numpy.random.uniform(size=(10,10)) # dtype is float64
b = numpy.random.uniform(size=(10,10)) # dtype is float64

# Create bytes object
buf = io.BytesIO()

# Save the arrays into the buffer
numpy.savez_compressed(buf, a=a, b=b)
buf.seek(0)

ab = numpy.load(buf)
print(ab['a'])
print(ab['b'])

# Closed the buffer
buf.close()

【讨论】:

有效!!虽然,它不适用于我的原始数组,但它们的 dtype 为“O”。我想这就是问题所在...... 这是 dtype。谢谢!!

以上是关于从压缩字节加载 numpy 数组的主要内容,如果未能解决你的问题,请参考以下文章

如何从 DirectShow 获取未压缩的字节数组?

将 bz2 压缩二进制文件导入为 numpy 数组

我如何“压缩排序”并行numpy数组?

解压缩文件将文件转换为字节

如何在 Numpy 中“压缩”几个 N-D 数组?

将 NumPy 数组的第一维解压缩到 pyplot.plot