Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何将numpy数组写入字节内存流?_Arrays_Python 2.7_Numpy_Tdd_Binary Data - Fatal编程技术网

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

Arrays 如何将numpy数组写入字节内存流?,arrays,python-2.7,numpy,tdd,binary-data,Arrays,Python 2.7,Numpy,Tdd,Binary Data,我正在Python2.7中对代码进行单元测试,该代码通过编写numpy数组。由于许多原因,在单元测试中执行文件IO是不好的,我如何用字节内存流代替文件句柄?(io.BytesIO无法工作,因为ndarray.toFile()要求它提供文件名。)a适合您的用途吗 它公开了与普通文件对象相同的接口,因此您可以将其直接传递给np.ndarray.tofile(),并在显式关闭或垃圾回收时立即将其删除: import numpy as np from tempfile import TemporaryF

我正在Python2.7中对代码进行单元测试,该代码通过编写numpy数组。由于许多原因,在单元测试中执行文件IO是不好的,我如何用字节内存流代替文件句柄?(
io.BytesIO
无法工作,因为
ndarray.toFile()
要求它提供文件名。)

a适合您的用途吗

它公开了与普通文件对象相同的接口,因此您可以将其直接传递给
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()
最终需要一个有效的OS级文件描述符。

难道
tobytes
frombuffer
不应该做测试所需的事情吗

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

使用文件io构建自动化单元测试会留下导致测试行为不确定性的竞争条件。如果添加睡眠以确保异步文件io完成,那么就会出现缓慢的单元测试,而缓慢的单元测试无法扩展到在几秒钟内运行数百个单元测试。您的建议对于一些系统测试来说是非常好的,但这不是我正在做的。如果您能提供更多关于您的需求的信息,这将是非常有帮助的。你在写多少数据?你需要能够读回它吗?你关心什么样的比赛条件?你真的需要使用
tofile
?我想测试一个使用numbpy的应用程序。应用程序正在创建文件。我需要将字节写入kb,以确认是否生成了正确的字节。为了编写能够跨硬件一致工作的自动化测试,我想在将内存输出流写入文件之前检查它。我发现最后一部分很困难,因为尽管nddarray.toFile()的api文档说它需要一个filehandler参数或一个流句柄,但它不处理我传入的bytesIo句柄。我担心到目前为止,它需要一个文件处理程序。:-)我正在查看nddarray.toBytes()并进行一些测试,以确定是否可以假设toBytes()将镜像使用toFile()编写的内容。如果行得通,我会想办法的。可能将其用于mocking.FWIW,这里是C源代码中的,它依次调用(注意使用
os.dup
复制文件描述符)。这一切都是在C级进行的,所以我看不到一种通过Python对象伪造打开文件的简单方法。假设tofile()不偏离tobytes,这将起作用。这是目前numpy状态的最佳答案。不幸的是,tofile不接受流,因此可以直接测试单元测试tofile()API。