4个稳定版本
新版本 2.0.2 | 2024年8月19日 |
---|---|
1.1.0 | 2023年4月28日 |
1.0.0 | 2023年4月2日 |
#347 in 编码
每月 60 次下载
在 2 个crates中使用(通过 ascom-alpaca)
26KB
458 行
serde-ndim
概述
此crate提供了一种从自描述格式(如JSON)序列化和反序列化任意维度数组的方法,其中不提供有关结果数组形状的任何外部数据。
这对于某些数据源(例如在天文应用中)很有用,但不是内置的Serde集成(如流行crate的ndarray
或nalgebra
)支持的格式。
考虑以下输入
[
[
[1, 2, 3, 4],
[4, 5, 6, 7]
],
[
[7, 8, 9, 10],
[10, 11, 12, 13]
],
[
[13, 14, 15, 16],
[16, 17, 18, 19]
]
]
这应该反序列化为形状为 [3, 2, 4]
的三维数组。此crate提供了 serialize
和 deserialize
函数,可以通过 #[serde)]
使用 #[serde)]
来实现这一点。
反序列化
反序列化的难点在于在读取数据时构建和学习内部一致性
- 在第一次下降过程中,它等待到达叶子数字(例如上面的示例中的
1
)以确定维数(示例中的3
)。 - 它从第一步开始展开并读取序列
[1, 2, 3, 4]
,学习其长度(4
)。现在它记得期望的形状为[unknown, unknown, 4]
- 它还没有看到更高维度的长度,但至少它知道有3
个维度,最后一个维度长度为4
。 - 它向上展开一步,递归到下一个序列,并读取
[4, 5, 6, 7]
。这次它知道这不是第一次下降到这个维度,所以它不是学习它,而是将新的长度与存储的长度进行验证(4 == 4
,一切良好)。 - 它到达了这个序列序列的末尾,所以现在它知道并存储期望的形状为
[unknown, 2, 4]
。 - 通过重复这个过程,它最终学会了并验证了整个数组的形状为
[3, 2, 4]
。 - 在此期间,它将原始数字收集到一个扁平的
Vec<_>
中,作为多维数组的优化存储。现在它只需要调用一个函数,该函数可以从形状和平展数据构造多维数组。
注意:结果数组将以标准列主序布局。
在 ndarray
和 nalgebra
功能下提供了 ndarray::Array
和 nalgebra::DMatrix
的构造函数,因此您可以使用它们如下
use serde::{Deserialize, Serialize};
#[derive(Deserialize, Serialize)]
struct MyStruct {
#[serde(with = "serde_ndim")]
ndarray: ndarray::ArrayD<f32>,
/* ... */
}
您还可以通过实现 serde_ndarray::de::MakeNDim
特性来重用自定义类型的反序列化。
序列化
序列化也提供了。它的实现要简单得多,所以这里不会详细介绍,如果您想查看代码,请随意。
此功能也适用于 ndarray::Array
和 nalgebra::DMatrix
,但如果你想要序列化自定义类型,可以通过实现 serde_ndarray::ser::NDim
接口来实现。
依赖项
~0.1–1.4MB
~27K SLoC