【问题标题】:How to write a numpy array to a byte memorystream?如何将 numpy 数组写入字节内存流?
【发布时间】:2015-10-03 11:37:28
【问题描述】:

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

【问题讨论】:

    标签: arrays python-2.7 numpy tdd binary-data


    【解决方案1】:

    不应该 tobytes [1]frombuffer [2] 做你需要的测试目的吗?

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

    【讨论】:

    • 假设 tofile() 不偏离 tobytes,这将起作用。这是numpy当前状态的最佳答案。不幸的是 tofile 不接受流,因此可以直接测试单元测试 tofile() API。
    【解决方案2】:

    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 完成,那么您的单元测试速度很慢,并且慢速单元测试无法扩展到在几秒钟内运行数百个单元测试。您的建议对于一些系统测试来说非常好,但这不是我正在做的。
    • 如果您能提供更多有关您的要求的信息,将会很有帮助。你要写多少数据?你需要能够读回来吗?你关心什么样的比赛条件?你绝对需要使用tofile吗?
    • 我想测试一个使用 numbpy 的应用程序。应用程序正在创建文件。我需要将一个字节写入 kb 以确认是否生成了正确的字节。为了编写可以在硬件上一致工作的自动化测试,我想在将其写入文件之前检查内存中的输出流。最后一部分我觉得很困难,因为虽然 nddarray.toFile() 的 api 文档说它需要一个文件处理程序参数或一个流的句柄,但它不处理我传入的 bytesIo 句柄。我担心因为现在,它需要一个文件处理程序。 :-)
    • 我正在查看 nddarray.toBytes() 并进行一些测试,看看我是否可以假设 toBytes() 将反映使用 toFile() 写出的内容。如果这行得通,我会想办法的。也许用它来模拟。
    • FWIW,这里是 C 源代码中的 relevant method,它依次调用 npy_PyFile_Dup2(注意使用 os.dup 来复制文件描述符)。这一切都发生在 C 级别,所以我看不到通过 Python 对象伪造打开文件的简单方法。
    猜你喜欢
    • 2014-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多