[Feature request] `ArrayRef<A, Ix2>.dot()` for axis greater than `Ix2`
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 45/100
Línea de trabajo
Start from the ndarray dot() entry point and inspect how dimensions are currently constrained. Compare the requested behavior with the provided Ix3-by-Ix2 example, then verify that higher-rank left-hand arrays produce the expected NumPy-compatible shape while preserving existing Ix2 behavior.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
In NumPy, the left-hand side of a matrix multiplication can have as many axes as desired, as long as it has more than 2 axes and the last axis's dimension matches that of the 0th axis of the right-hand side, e.g.:
import numpy as np
x = np.random.random((3, 2, 5, 9, 12))
y = np.random.random((12, 13))
(x @ y).shape
# (3, 2, 5, 9, 13)
In ndarray, you can't do this directly:
// Doesn't compile:
use ndarray::prelude::*;
use ndarray_rand::RandomExt;
use ndarray_rand::rand_distr::Uniform;
fn main() {
let x: Array<f64, Ix3> = Array::random(
(12, 4, 3),
Uniform::new(0., 1.).unwrap()
);
let y: Array<f64, Ix2> = Array::random(
(3, 2),
Uniform::new(0., 1.).unwrap()
);
let x_y = x.dot(&y);
println!("{}", x_y);
}
Compiler Output
$ cargo run
Compiling playground v0.1.0 (/home/connor/RustroverProjects/playground)
error[E0275]: overflow evaluating the requirement `&ArrayBase<_, _, _>: Not`
--> src/main.rs:15:17
|
15 | let x_y = x.dot(&y);
| ^^^
|
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`playground`)
= note: required for `&ArrayBase<_, _, _>` to implement `Not`
= note: 127 redundant requirements hidden
= note: required for `&ArrayBase<OwnedRepr<f64>, Dim<[usize; 3]>, f64>` to implement `Not`
For more information about this error, try `rustc --explain E0275`.
error: could not compile `playground` (bin "playground") due to 1 previous error
Emulating the behavior in the previous NumPy example requires a non-trivial amount of work, e.g. for x with 3 axes:
use ndarray::prelude::*;
use ndarray_rand::RandomExt;
use ndarray_rand::rand_distr::Uniform;
fn main() {
let x: Array<f64, Ix3> = Array::random((12, 4, 3), Uniform::new(0., 1.).unwrap());
let y = Array::random((3, 2), Uniform::new(0., 1.).unwrap());
let (a, b, c) = (x.len_of(Axis(0)), x.len_of(Axis(1)), x.len_of(Axis(2)));
let d = y.len_of(Axis(1));
let x_y: Array3<f64> = x
.to_shape((a * b, c)).unwrap()
.dot(&y)
.to_shape((a, b, d)).unwrap()
.to_owned();
println!("{:?}", x_y);
}
Therefore, I think it would be nice to have dot() be implemented for axis numbers greater than Ix2
- Lenguaje dominante
- Rust
- Estrellas
- 4.3k
- Forks
- 391
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Guía de contribución
No hay ninguna guía de contribución indexada para este repositorio
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de rust-ndarray/ndarray
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
rust-ndarray/ndarray#1612 · 1 comentario ·
-
Dificultad 4/5 3-5 días Aptitud para principiantes 48/100
rust-ndarray/ndarray#1617 · 1 comentario ·
-
Stack overflow in `triu` Abiertobug good first issue
Dificultad 3/5 1-2 días Aptitud para principiantes 68/100
rust-ndarray/ndarray#1615 · 1 comentario ·
-
Dificultad 4/5 3-5 días Aptitud para principiantes 48/100
rust-ndarray/ndarray#1610 ·
-
Dificultad 3/5 1-2 días Aptitud para principiantes 72/100
rust-ndarray/ndarray#1609 ·
Todos los issues de rust-ndarray/ndarray
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
-
state:needs triage
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
zed-industries/zed#64680 · 2 comentarios ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
RustPython/RustPython#8802 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
TheLarkInn/aipm#2390 ·