序列化 numpy 数组列表并将 back/deserialize 读入 Javascript
Serialize a list of numpy arrays and read back/deserialize into Javascript
考虑一个 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 格式:但这似乎需要实际写入 disk/filesystem?
欢迎使用这两种技术的工作代码或可能不同的 library/approach。
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 数组列表:
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 格式:但这似乎需要实际写入 disk/filesystem?
欢迎使用这两种技术的工作代码或可能不同的 library/approach。
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
)