rust-ndarray / ndarray-examples Goto Github PK
View Code? Open in Web Editor NEWA collection of examples leveraging the ndarray ecosystem.
License: Apache License 2.0
A collection of examples leveraging the ndarray ecosystem.
License: Apache License 2.0
Hello,
The build of the examples seem to be failing. It seems to complain that ndarray_linalg
doesnt exist.
This is the full error message I see.
~/ndarray-examples$ cargo build
Compiling linear_regression v0.1.0 (/path/to/ndarray-examples/linear_regression)
Compiling k_means v0.1.0 (/path/to/ndarray-examples/k_means)
error[E0432]: unresolved import `ndarray_linalg`
--> linear_regression/src/lib.rs:3:5
|
3 | use ndarray_linalg::Solve;
| ^^^^^^^^^^^^^^ use of undeclared crate or module `ndarray_linalg`
error[E0599]: no method named `solve_into` found for struct `ArrayBase` in the current scope
--> linear_regression/src/lib.rs:87:25
|
87 | linear_operator.solve_into(rhs).unwrap()
| ^^^^^^^^^^ method not found in `ArrayBase<OwnedRepr<f64>, Dim<[usize; 2]>>`
Some errors have detailed explanations: E0432, E0599.
For more information about an error, try `rustc --explain E0432`.
error: could not compile `linear_regression` due to 2 previous errors
warning: build failed, waiting for other jobs to finish...
Do you know what I should fix?
Hi!
Not sure if there's a better place for this, so please let me know if I'm out of line.
I'm (slowly) trying to port an existing python package of mine to rust. One of the first stumbling blocks was the (apparent) lack of a convolution function available in various rust libraries. Below is my solution.
(Also, I believe that using ffts for convolution is better only when the data is sufficiently big, so I'm interested in the naive method).
/// This function aims to reproduce the behaviour of numpy's convolve with
/// mode='same'.
pub fn convolve(data: ArrayView1<f64>, window: ArrayView1<f64>) -> Array1<f64> {
let padded = stack![
Axis(0),
Array1::zeros(window.len() / 2),
data,
Array1::zeros(window.len() / 2)
];
let mut w = window.view();
w.invert_axis(Axis(0));
padded
.windows(w.len())
.into_iter()
.map(|x| (&x * &w).sum())
.collect()
}
#[cfg(test)]
mod tests {
use super::*;
use float_cmp::*;
#[test]
fn convolve_odd_odd() {
let data = array![1., 2., 3.];
let window = array![0., 1., 0.5];
let expected = array![1., 2.5, 4.];
for (exp, res) in expected.iter().zip(&convolve(data.view(), window.view())) {
assert!(approx_eq!(f64, *exp, *res, ulps = 2));
}
}
#[test]
fn convolve_even_odd() {
let data = array![1., 2., 3., 4.];
let window = array![0., 1., 0.5];
let expected = array![1., 2.5, 4., 5.5];
for (exp, res) in expected.iter().zip(&convolve(data.view(), window.view())) {
assert!(approx_eq!(f64, *exp, *res, ulps = 2));
}
}
#[test]
fn convolve_even_even() {
let data = array![1., 2., 3., 4.];
let window = array![1., 0.5];
let expected = array![1., 2.5, 4., 5.5];
for (exp, res) in expected.iter().zip(&convolve(data.view(), window.view())) {
assert!(approx_eq!(f64, *exp, *res, ulps = 2));
}
}
#[test]
fn convolve_odd_even() {
let data = array![1., 2., 3., 4., 5.];
let window = array![1., 0.5];
let expected = array![1., 2.5, 4., 5.5, 7.];
for (exp, res) in expected.iter().zip(&convolve(data.view(), window.view())) {
assert!(approx_eq!(f64, *exp, *res, ulps = 2));
}
}
#[test]
fn convolve_odd_odd2() {
let data = array![1., 2., 3., 4., 5.];
let window = array![2., 1., 0., 1., 0.5];
let result = convolve(data.view(), window.view());
let expected = array![8., 12., 16.5, 9., 5.5];
for (exp, res) in expected.iter().zip(&result) {
assert!(approx_eq!(f64, *exp, *res, ulps = 2));
}
}
#[test]
fn convolve3() {
let data = array![1., 2., 3., 4.];
let window = array![1., 0., 1., 0.5];
let result = convolve(data.view(), window.view());
let expected = array![2., 4., 6.5, 4.];
for (exp, res) in expected.iter().zip(&result) {
assert!(approx_eq!(f64, *exp, *res, ulps = 2));
}
}
This probably could be better; any suggestions are welcome. I have no idea how to generalise this for higher dimensional arrays, so that's also a consideration. I'd be happy to put this into a PR if it's suitable somewhere.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.