Rust ndarray 不匹配的类型
Rust ndarray mismatched types
我正在尝试使用 ndarray_image 从图像中获取 Array3:
pub fn from_png(path: &str) -> Result<Self, &str> {
return match ndarray_image::open_image(path, Colors::Rgba) {
Ok(data) => { ;
let size = Size {
x: data.shape()[0],
y: data.shape()[1]
};
Ok( Self { data, size } )
}
Err(_) => {
Err("Unable to open image!")
}
}
}
Self.data 类型是 Array3,open_image returns 是 Array3。太奇怪了,但错误类型也一样:
error[E0308]: mismatched types
|
| Ok( Self { data, size } )
| ^^^^ expected struct `ArrayBase`, found struct `ndarray::ArrayBase`
|
= note: expected struct `ArrayBase<OwnedRepr<u8>, Dim<[usize; 3]>>`
found struct `ndarray::ArrayBase<ndarray::data_repr::OwnedRepr<u8>, ndarray::dimension::dim::Dim<[usize; 3]>>`
= note: perhaps two different versions of crate `ndarray` are being used?
关于版本:我对所有 ndarray-* crates 使用版本“0”。
Cargo.toml 中的依赖项:
[dependencies]
bytes = "1.1.0"
font-kit = "0.10.1"
pathfinder_geometry = "0.5.1"
image = "0.23.14"
rayon = "1.5.1"
ndarray = { version="0", features=["rayon", "serde"]}
serde = "1.0.133"
serde_json = "1.0.74"
ndarray-stats = "0"
ndarray-image = "0"
这是我在整个依赖关系树中为 ndarray
获取的内容:
$ cargo tree | grep ndarray
├── ndarray v0.15.4
├── ndarray-image v0.3.0
│ └── ndarray v0.14.0
├── ndarray-stats v0.5.0
│ ├── ndarray v0.15.4 (*)
如您所见,ndarray
确实有两个不兼容的版本 - 一个由 ndarray-image
引入,另一个由 ndarray-stats
.
引入
原因是 Cargo 不会尝试根据它们的 依赖项来解析直接依赖项版本。它只知道你为每个 ndarray-*
请求了一些 0.x.y
版本,所以它选择了最新的版本——它们碰巧不能一起使用。
要使其正常工作,您必须将 ndarray
降级到可用于其他依赖项的最低版本,即 0.14
.
对于直接依赖,这就像明确要求所需的版本一样简单。
对于 ndarray-stats
,我们必须查看以前的版本以查找它们的依赖项;令人高兴的是,crate page: the version we're looking for is 0.4.0
.
中明确记录了这一点
也建议为 ndarray-image
固定次要版本,这样就不会在更新时意外再次出现损坏。
现在,Cargo.toml
的相应部分如下所示:
ndarray = { version="0.14", features=["rayon", "serde"]}
ndarray-stats = "0.4"
ndarray-image = "0.3"
而cargo tree
的输出是这样的:
$ cargo tree | grep ndarray
├── ndarray v0.14.0
├── ndarray-image v0.3.0
│ └── ndarray v0.14.0 (*)
├── ndarray-stats v0.4.0
│ ├── ndarray v0.14.0 (*)
我无法按原样检查你的代码,因为它不是 MRE,但在这些更改之后它应该可以编译 - 如果你使用了来自 ndarray v0.15
.
我正在尝试使用 ndarray_image 从图像中获取 Array3:
pub fn from_png(path: &str) -> Result<Self, &str> {
return match ndarray_image::open_image(path, Colors::Rgba) {
Ok(data) => { ;
let size = Size {
x: data.shape()[0],
y: data.shape()[1]
};
Ok( Self { data, size } )
}
Err(_) => {
Err("Unable to open image!")
}
}
}
Self.data 类型是 Array3,open_image returns 是 Array3。太奇怪了,但错误类型也一样:
error[E0308]: mismatched types
|
| Ok( Self { data, size } )
| ^^^^ expected struct `ArrayBase`, found struct `ndarray::ArrayBase`
|
= note: expected struct `ArrayBase<OwnedRepr<u8>, Dim<[usize; 3]>>`
found struct `ndarray::ArrayBase<ndarray::data_repr::OwnedRepr<u8>, ndarray::dimension::dim::Dim<[usize; 3]>>`
= note: perhaps two different versions of crate `ndarray` are being used?
关于版本:我对所有 ndarray-* crates 使用版本“0”。
Cargo.toml 中的依赖项:
[dependencies]
bytes = "1.1.0"
font-kit = "0.10.1"
pathfinder_geometry = "0.5.1"
image = "0.23.14"
rayon = "1.5.1"
ndarray = { version="0", features=["rayon", "serde"]}
serde = "1.0.133"
serde_json = "1.0.74"
ndarray-stats = "0"
ndarray-image = "0"
这是我在整个依赖关系树中为 ndarray
获取的内容:
$ cargo tree | grep ndarray
├── ndarray v0.15.4
├── ndarray-image v0.3.0
│ └── ndarray v0.14.0
├── ndarray-stats v0.5.0
│ ├── ndarray v0.15.4 (*)
如您所见,ndarray
确实有两个不兼容的版本 - 一个由 ndarray-image
引入,另一个由 ndarray-stats
.
原因是 Cargo 不会尝试根据它们的 依赖项来解析直接依赖项版本。它只知道你为每个 ndarray-*
请求了一些 0.x.y
版本,所以它选择了最新的版本——它们碰巧不能一起使用。
要使其正常工作,您必须将 ndarray
降级到可用于其他依赖项的最低版本,即 0.14
.
对于直接依赖,这就像明确要求所需的版本一样简单。
对于 ndarray-stats
,我们必须查看以前的版本以查找它们的依赖项;令人高兴的是,crate page: the version we're looking for is 0.4.0
.
中明确记录了这一点
也建议为 ndarray-image
固定次要版本,这样就不会在更新时意外再次出现损坏。
现在,Cargo.toml
的相应部分如下所示:
ndarray = { version="0.14", features=["rayon", "serde"]}
ndarray-stats = "0.4"
ndarray-image = "0.3"
而cargo tree
的输出是这样的:
$ cargo tree | grep ndarray
├── ndarray v0.14.0
├── ndarray-image v0.3.0
│ └── ndarray v0.14.0 (*)
├── ndarray-stats v0.4.0
│ ├── ndarray v0.14.0 (*)
我无法按原样检查你的代码,因为它不是 MRE,但在这些更改之后它应该可以编译 - 如果你使用了来自 ndarray v0.15
.