序列化 numpy 数组列表并读回/反序列化为 Javascript

Posted

技术标签:

【中文标题】序列化 numpy 数组列表并读回/反序列化为 Javascript【英文标题】:Serialize a list of numpy arrays and read back/deserialize into Javascript 【发布时间】:2021-03-11 17:08:53 【问题描述】:

考虑一个 numpy 数组列表:

arr = [np.linspace(a1,a2,11) for a1,a2 in [(1,10),(20,30)]]
nparr = np.array(arr)

我想将其序列化以传输到 javascript REST 客户端。首选方法是

高效地序列化为二进制安全格式并将其烘焙到 JSON 对象中的 Base64 编码字段中 通过 http 传输 JSON 对象 将 JSON 对象接收到 javascript 侦听器中。 Base64 解码字段并使用高效的 javascript 反序列化库反序列化为二进制数组

我对支持两种语言的 apache arrow 进行了初步调查。

注意:我尝试了以下方法:

转换为二维numpy数组 转换为pyarrow

下面发生了

pyarr = pya.array(nparr)


ArrowInvalid                              Traceback (most recent call last)
<ipython-input-11-68eb3e5f578f> in <module>
----> 1 pyarr = pya.array(nparr)

ArrowInvalid: only handle 1-dimensional arrays

所以 pyarrow 在它可以序列化的数据结构方面似乎非常有限。我也在研究 apache parquet 格式:但这似乎需要实际写入磁盘/文件系统?

欢迎使用这两种技术的工作代码或可能的不同库/方法。

【问题讨论】:

【参考方案1】:

Arrow 能够序列化浮点数组列表。但是如果列表是多维numpy数组,我认为它需要一点帮助:

pa.array(
    arr.tolist(),
    pa.list_(pa.float64())
)

但鉴于您的用例,由于所有数组的长度相同,我建议使用 Table 而不是 Array

schema = pa.schema(
        [
            pa.field(str(i), pa.float64())
            for i in range(len(nparr))
        ]
        
    )

table = pa.Table.from_arrays(
    nparr,
    schema=schema
)

【讨论】:

以上是关于序列化 numpy 数组列表并读回/反序列化为 Javascript的主要内容,如果未能解决你的问题,请参考以下文章

使用 .NET 4.0 任务模式使用 HTTPClient .ReadAsAsync 将 JSON 反序列化为数组或列表

Symfony - 将 json 反序列化为实体数组

c ++ boost将char数组反序列化为obj

将json反序列化为键值对列表[重复]

将特定 JSON 字段反序列化为 Unity 中的对象列表

将 JSON 命名属性反序列化为 .Net 对象