ndarray für Rust: Vollständige Anleitung für N-dimensionale Arrays
1. Was ist ndarray und warum braucht man es?
Die Bibliothek ndarray ist die Standarderweiterung im Rust-Ökosystem für die Arbeit mit mehrdimensionalen Arrays (N-dimensionalen Tensoren). Sie bietet leistungsstarke, typsichere und effiziente Datenstrukturen für numerische Berechnungen, lineare Algebra, Signalverarbeitung, maschinelles Lernen und wissenschaftliche Berechnungen. Wenn Sie mit NumPy in Python vertraut sind, ist ndarray das direkte Pendant in der Rust-Welt – mit den Vorteilen strenger Typisierung, fehlendem Garbage Collector und voller Speicherkontrolle.
Warum wird es benötigt? Rust hat keine eingebaute Unterstützung für mehrdimensionale Arrays mit einer beliebigen Anzahl von Achsen. Standard-Vektoren (Vec<T>) und Slices (&[T]) erlauben nur die Arbeit mit eindimensionalen Daten. Für Aufgaben, die Matrixalgebra, Faltungen, Tensoroperationen oder Bildverarbeitung erfordern, ist eine spezialisierte Bibliothek notwendig. ndarray löst diese Probleme und bietet:
- Typisierte N-dimensionale Arrays (
ArrayBase) mit fester oder dynamischer Achsenanzahl. - Effizientes Slicing, Indizierung und Iteration.
- Vektorisierte arithmetische Operationen (Broadcasting).
- Integration mit BLAS/LAPACK über
ndarray-linalgfür hochperformante lineare Algebra. - Unterstützung für parallele Berechnungen via
rayon.
Die Bibliothek wird aktiv in Projekten wie RustML, Linfa (Machine-Learning-Framework), Image (Bildverarbeitung) und vielen anderen eingesetzt. Sie ist das Fundament für wissenschaftliches Rechnen in Rust.
2. Installation
Für die Installation von ndarray verwenden Sie den Paketmanager Cargo, der Teil von Rust ist. Fügen Sie die Abhängigkeit in Ihre Cargo.toml-Datei ein:
[dependencies]
ndarray = "0.16"
Führen Sie dann folgenden Befehl im Terminal aus:
cargo build
Für lineare Algebra (Matrixmultiplikation, Eigenwerte) fügen Sie ndarray-linalg hinzu und wählen ein BLAS-Backend (z.B. OpenBLAS oder Intel MKL):
[dependencies]
ndarray = "0.16"
ndarray-linalg = { version = "0.16", features = ["openblas"] }
Für parallele Iterationen verwenden Sie ndarray-parallel:
[dependencies]
ndarray = "0.16"
ndarray-parallel = "0.16"
3. Schnellstart – Minimales Beispiel
Wir erstellen ein eindimensionales Array, führen eine elementweise Addition durch und geben das Ergebnis aus. Speichern Sie folgenden Code in src/main.rs:
use ndarray::Array;
fn main() {
// Eindimensionales Array mit 5 Elementen erstellen
let a = Array::from_vec(vec![1, 2, 3, 4, 5]);
let b = Array::from_vec(vec![10, 20, 30, 40, 50]);
// Elementweise Addition
let c = &a + &b;
println!("a = {:?}", a);
println!("b = {:?}", b);
println!("a + b = {:?}", c);
}
Starten Sie das Programm:
cargo run
Ausgabe:
a = [1, 2, 3, 4, 5], shape=[5], strides=[1], layout=CFcf (0x1)
b = [10, 20, 30, 40, 50], shape=[5], strides=[1], layout=CFcf (0x1)
a + b = [11, 22, 33, 44, 55], shape=[5], strides=[1], layout=CFcf (0x1)
4. Wichtige Methoden und Funktionen (mindestens 8)
4.1. Array::from_shape_vec
Signatur: pub f
Auch in der Bibliothek
NodaTime für C# (.NET): Vollständiges Tutorial mit Beispielen
Arbeiten mit ZIP/Archiven in TypeScript: vollständige Anleitung zu JSZip und adm-zip
Testen in C++: Überblick über Frameworks und Tools (Google Test, Catch2, doctest)
Paging 3 für Kotlin: Vollständiges Tutorial mit Beispielen