如何将numpy数组写入字节内存流?

3

我正在使用Python2.7编写单元测试代码,通过ndarray.tofile(fileHandle,..)将numpy数组写入文件。由于在单元测试中进行文件IO有很多不好的原因,所以我该如何替换文件句柄为字节内存流呢?(io.BytesIO无法工作,因为ndarray.toFile()要求一个文件名。)

2个回答

3

对于测试目的,tobytes[1]frombuffer[2]不应该是您所需的吗?

m = np.random.rand(5,3)
b = m.tobytes()
mb = np.frombuffer(b).reshape(m.shape)

1
假设tofile()不会偏离tobytes,那么这将起作用。对于numpy的当前状态来说,这是最好的答案。不幸的是,tofile不接受流,因此无法直接测试单元测试tofile() API。 - Lance Kind

0

一个 tempfile.TemporaryFile 对你有用吗?

它暴露了与普通文件对象相同的接口,所以你可以直接将其传递给 np.ndarray.tofile(),当它被明确关闭或垃圾回收时,它会立即被删除:

import numpy as np
from tempfile import TemporaryFile

x = np.random.randn(1000)

with TemporaryFile() as t:
    x.tofile(t)
    # do your testing...

# t is closed and deleted

然而,它将暂时驻留在磁盘上(通常在Linux机器上的/tmp/),但我没有看到完全避免I/O的简单方法,因为.tofile()最终需要一个有效的操作系统级文件描述符。


使用文件IO构建自动化单元测试会留下竞争条件,导致测试行为不确定。如果添加睡眠以确保异步文件IO完成,则会导致缓慢的单元测试,而缓慢的单元测试无法扩展到在几秒钟内运行数百个单元测试。你所建议的对于一些系统测试来说是完全可以接受的,但这不是我正在做的事情。 - Lance Kind
如果您能提供更多有关您需求的信息,那将会很有帮助。您要写入多少数据?您需要能够读取回来吗?您担心什么样的竞争条件?您是否一定需要使用“tofile”? - ali_m
我想测试一个使用numbpy的应用程序。该应用程序正在创建文件。我需要写出bytes以kb来确认是否产生了正确的bytes。为了编写自动化测试,可以在硬件上始终正常工作,我想在将其写入文件之前检查内存输出流。最后这部分我觉得有些困难,因为尽管nddarray.toFile()的api文档说它接受一个文件处理程序参数或流的句柄,但它不能处理我传入的bytesIo句柄。恐怕现在仍需要一个文件处理程序。 :-) - Lance Kind
我正在研究nddarray.toBytes(),并进行一些测试,以确定是否可以假定toBytes()会反映使用toFile()写出的内容。如果成功了,我会想出一些办法。也许可以用它来模拟。 - Lance Kind
这是相关方法(https://github.com/numpy/numpy/blob/d033b6e19fc95a1f1fd6592de8318178368011b1/numpy/core/src/multiarray/methods.c#L552-L585)在C源代码中的实现,该方法调用[`npy_PyFile_Dup2`](https://github.com/numpy/numpy/blob/e3b2bc0b0f31482cd112660393245116ae55ecbf/numpy/core/include/numpy/npy_3kcompat.h#L148-L219)(请注意使用`os.dup`来复制文件描述符)。由于所有操作都在C级别进行,因此我不认为有一种简单的方法可以通过Python对象伪造打开的文件。 - ali_m
如果你正在使用Linux,并且不需要解决方案是跨平台的,那么我想你可以创建一个普通的Python文件在tmpfs里。 - ali_m

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接