在最近的question中,我询问了将大型numpy数组转换为分隔字符串的最快方法。我之所以提出这个问题,是因为我想把这个纯文本字符串转换成(例如通过HTTP)发送给用其他编程语言编写的客户端。一个分隔的数字字符串显然是任何客户端程序可以轻松使用的东西。但是,有人建议,因为字符串转换很慢,所以在Python端对数组进行base64编码并将其作为二进制发送会更快。这确实更快。
我现在的问题是,(1)如何确保我的编码numpy数组能够很好地传送到不同操作系统和不同硬件上的客户端,以及(2)如何在客户端解码二进制数据。 / p>
对于(1),我倾向于做类似以下的事情
import numpy as np
import base64
x = np.arange(100, dtype=np.float64)
base64.b64encode(x.tostring())
还有什么我需要做的吗?
对于(2),我很乐意在任何编程语言中都有一个例子,其目标是获取numpy浮点数并将它们转换为类似的本机数据结构。假设我们已经完成了base64解码并且有一个字节数组,并且我们也知道了numpy dtype,维度和所需的任何其他元数据。
感谢。
答案 0 :(得分:3)
您应该真正研究OPeNDAP以简化科学数据网络的各个方面。对于Python,请查看Pydap。
您可以通过h5py(或NetCDF)将NumPy阵列直接存储为HDF5格式,然后使用OPeNDAP通过HTTP将数据流式传输到客户端。
答案 1 :(得分:1)
我建议使用现有的数据格式来交换科学数据/数组,例如NetCDF或HDF。在Python中,您可以使用具有numpy绑定的PyNIO库,并且有其他语言的库。这两种格式都是为处理大数据和处理语言,机器表示问题等而构建的。它们也适用于消息传递,例如在并行计算中,所以我怀疑你的用例是满意的。
答案 2 :(得分:1)
对于比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绑定!)。
根据您的情况进行权衡取舍。
答案 3 :(得分:0)
numpy数组的tostring
方法基本上是为了转储数组数据所使用的内存(不是Python的对象包装器,而只是数组的数据。)这类似于struct
stdlib模块。 Base64编码该字符串并将其发送到应该是非常好的,尽管您可能还需要发送所使用的实际数据类型,以及尺寸,如果它是一个多维数组,因为您将无法告诉那些只是来自数据。
另一方面,如何阅读数据取决于语言。大多数语言都有一种方法可以将这样的内存块作为特定类型的数组来处理。例如,在C中,您可以简单地对字符串进行base64解码,将其分配给({在您的示例中)float64 *
并将其索引。这并没有给你任何内置的安全措施和函数以及numpy数组在Python中的其他操作,但那是因为C在这方面是一种完全不同的语言。