在Python外读取numpy数组

6 投票
4 回答
3221 浏览
提问于 2025-04-15 22:05

在最近的一个提问中,我询问了将一个大的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的数据类型、维度以及其他需要的元数据。

谢谢。

4 个回答

2

如果你想找一种比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

你真的应该了解一下 OPeNDAP,它可以让科学数据的网络传输变得简单很多。如果你用Python,可以看看 Pydap

你可以直接把你的NumPy数组存储成HDF5格式,方法是使用 h5py(或者NetCDF),然后通过OPeNDAP把数据通过HTTP传输给客户端。

0

numpy数组的tostring方法其实就是把数组的数据在内存中用一种格式展示出来(不是Python对象的包装,而是数组本身的数据)。这有点像struct这个标准库模块。把这个字符串进行Base64编码后发送出去应该就足够了,不过你可能还需要发送实际使用的数据类型,以及如果是多维数组的话,还需要发送它的维度,因为光靠数据是无法判断这些信息的。

至于如何读取这些数据,这就要看你用的编程语言了。大多数语言都有办法把这样的内存块当作特定类型的数组来处理。例如,在C语言中,你可以简单地对这个字符串进行Base64解码,然后把它赋值给(在你的例子中)一个float64 *类型的指针,然后就可以通过索引来访问数据了。不过,这样做就没有numpy数组在Python中提供的那些内置保护、函数和其他操作了,因为C语言在这方面和Python是完全不同的。

撰写回答