【问题标题】:Reading numpy arrays outside of Python在 Python 之外读取 numpy 数组
【发布时间】:2010-04-27 22:24:09
【问题描述】:

在最近的question 中,我询问了将大型 numpy 数组转换为分隔字符串的最快方法。我问的原因是因为我想把纯文本字符串传输给用其他编程语言编写的客户端(例如通过 HTTP)。显然,任何客户端程序都可以轻松使用分隔的数字字符串。但是,有人建议,由于字符串转换很慢,所以在 Python 端对数组进行 base64 编码并以二进制形式发送会更快。这确实更快。

我现在的问题是,(1) 我如何确保我编码的 numpy 数组能够很好地传输到不同操作系统和不同硬件上的客户端,以及 (2) 我如何在客户端解码二进制数据。

对于(1),我倾向于做如下的事情

import numpy as np
import base64
x = np.arange(100, dtype=np.float64)
base64.b64encode(x.tostring())

我还有什么需要做的吗?

对于 (2),我很乐意在任何编程语言中提供一个示例,其目标是获取浮点数的 numpy 数组并将它们转换为类似的本机数据结构。假设我们已经完成了 base64 解码并有一个字节数组,并且我们还知道 numpy dtype、维度和任何其他需要的元数据。

谢谢。

【问题讨论】:

  • 您可以使用 .npy 格式和 numpy.save... 并将其作为二进制文件发送。您只需要在接收语言中实现一个简单的解析器。

标签: python numpy


【解决方案1】:

您真的应该研究 OPeNDAP 以简化科学数据网络的各个方面。对于 Python,请查看 Pydap

您可以通过h5py(或 NetCDF)直接将 NumPy 数组存储为 HDF5 格式,然后使用 OPeNDAP 通过 HTTP 将数据流式传输到客户端。

【讨论】:

    【解决方案2】:

    我建议使用现有的数据格式来交换科学数据/数组,例如 NetCDFHDF。在 Python 中,您可以使用具有 numpy 绑定的 PyNIO 库,并且还有几个用于其他语言的库。这两种格式都是为处理大数据而构建的,并处理语言、机器表示问题等。它们也适用于消息传递,例如在并行计算中,所以我怀疑你的用例已经满足了。

    【讨论】:

      【解决方案3】:

      对于比 HDF 更轻量级的东西(尽管公认也更临时),您也可以使用 JSON:

      import json
      import numpy as np
      
      x = np.arange(100, dtype=np.float64)
      
      print json.dumps(dict(data=x.tostring(),
                            shape=x.shape,
                            dtype=str(x.dtype)))
      

      这将使您的客户无需安装 HDF 包装器,但代价是必须处理非标准的数据交换协议(并且可能还需要安装 JSON 绑定!)。

      权衡取舍取决于您自己的情况。

      【讨论】:

        【解决方案4】:

        numpy 数组的 tostring 方法所做的基本上是为您提供数组数据使用的内存的转储(不是 Python 的对象包装器,而是数组的数据。)这类似于 @ 987654322@ stdlib 模块。 Base64 编码该字符串并将其发送出去应该已经足够好了,尽管您可能还需要发送实际使用的数据类型,以及如果它是多维数组的维度,因为您无法告诉那些只是来自数据。

        另一方面,如何读取数据在一定程度上取决于语言。大多数语言都有一种将这样的内存块寻址为特定类型的数组的方法。例如,在 C 中,您可以简单地对字符串进行 base64 解码,将其分配给(在您的示例中)float64 * 并索引。这并没有为您提供任何内置保护措施和函数以及 numpy 数组在 Python 中具有的其他操作,但那是因为 C 在这方面是完全不同的语言。

        【讨论】:

          猜你喜欢
          • 2020-07-02
          • 2016-06-05
          • 1970-01-01
          • 2018-07-21
          • 2021-07-05
          • 2018-01-03
          • 2015-03-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多