#array #matrix #blas

no-std ndarray

An n-dimensional array for general elements and for numerics. Lightweight array views and slicing; views support chunking and splitting.

92 releases

0.17.2 Jan 10, 2026
0.17.1 Nov 2, 2025
0.17.0 Oct 14, 2025
0.16.1 Aug 14, 2024
0.3.0-alpha.1 Dec 27, 2015

#6 in Data structures

Download history 898268/week @ 2025-10-14 905009/week @ 2025-10-21 947466/week @ 2025-10-28 994296/week @ 2025-11-04 1084205/week @ 2025-11-11 1201657/week @ 2025-11-18 805193/week @ 2025-11-25 1072760/week @ 2025-12-02 1538246/week @ 2025-12-09 1398365/week @ 2025-12-16 594094/week @ 2025-12-23 694620/week @ 2025-12-30 1419522/week @ 2026-01-06 1521656/week @ 2026-01-13 1869252/week @ 2026-01-20 1449553/week @ 2026-01-27

6,460,772 downloads per month
Used in 3,661 crates (1,859 directly)

MIT/Apache

1MB
18K SLoC

ndarray implements an n-dimensional container for general elements and for numerics.

In n-dimensional we include for example 1-dimensional rows or columns, 2-dimensional matrices, and higher dimensional arrays. If the array has n dimensions, then an element in the array is accessed by using that many indices. Each dimension is also called an axis.

Highlights

  • Generic n-dimensional array
  • Slicing, also with arbitrary step size, and negative indices to mean elements from the end of the axis.
  • Views and subviews of arrays; iterators that yield subviews.
  • Higher order operations and arithmetic are performant
  • Array views can be used to slice and mutate any [T] data using ArrayView::from and ArrayViewMut::from.
  • Zip for lock step function application across two or more arrays or other item producers (NdProducer trait).

lib.rs:

The ndarray crate provides an n-dimensional container for general elements and for numerics.

In n-dimensional we include, for example, 1-dimensional rows or columns, 2-dimensional matrices, and higher dimensional arrays. If the array has n dimensions, then an element in the array is accessed by using that many indices. Each dimension is also called an axis.

To get started, functionality is provided in the following core types:

  • ArrayBase: The n-dimensional array type itself.
    It is used to implement both the owned arrays and the views; see its docs for an overview of all array features.
  • The main specific array type is Array, which owns its elements.
  • A reference type, ArrayRef, that contains most of the functionality for reading and writing to arrays.
  • A reference type, LayoutRef, that contains most of the functionality for reading and writing to array layouts: their shape and strides.

Highlights

  • Generic n-dimensional array
  • Slicing, also with arbitrary step size, and negative indices to mean elements from the end of the axis.
  • Views and subviews of arrays; iterators that yield subviews.
  • Higher order operations and arithmetic are performant
  • Array views can be used to slice and mutate any [T] data using ArrayView::from and ArrayViewMut::from.
  • [Zip] for lock step function application across two or more arrays or other item producers (NdProducer trait).

Crate Status

  • Still iterating on and evolving the crate

    • The crate is continuously developing, and breaking changes are expected during evolution from version to version. We adopt the newest stable rust features if we need them.
    • Note that functions/methods/traits/etc. hidden from the docs are not considered part of the public API, so changes to them are not considered breaking changes.
  • Performance:

    • Prefer higher order methods and arithmetic operations on arrays first, then iteration, and as a last priority using indexed algorithms.
    • The higher order functions like .map(), .map_inplace(), .zip_mut_with(), [Zip] and azip!() are the most efficient ways to perform single traversal and lock step traversal respectively.
    • Performance of an operation depends on the memory layout of the array or array view. Especially if it's a binary operation, which needs matching memory layout to be efficient (with some exceptions).
    • Efficient floating point matrix multiplication even for very large matrices; can optionally use BLAS to improve it further.
  • MSRV: Requires Rust 1.64 or later

Crate Feature Flags

The following crate feature flags are available. They are configured in your Cargo.toml. See doc::crate_feature_flags for more information.

  • std: Rust standard library-using functionality (enabled by default)
  • serde: serialization support for serde 1.x
  • rayon: Parallel iterators, parallelized methods, the parallel module and par_azip!.
  • approx Implementations of traits from the approx crate.
  • blas: transparent BLAS support for matrix multiplication, needs configuration.
  • matrixmultiply-threading: Use threading from matrixmultiply.

Documentation

  • The docs for ArrayBase provide an overview of the n-dimensional array type. Other good pages to look at are the documentation for the s![] and azip!() macros.

  • If you have experience with NumPy, you may also be interested in ndarray_for_numpy_users.

The ndarray ecosystem

ndarray provides a lot of functionality, but it's not a one-stop solution.

ndarray includes matrix multiplication and other binary/unary operations out of the box. More advanced linear algebra routines (e.g. SVD decomposition or eigenvalue computation) can be found in ndarray-linalg.

The same holds for statistics: ndarray provides some basic functionalities (e.g. mean) but more advanced routines can be found in ndarray-stats.

If you are looking to generate random arrays instead, check out ndarray-rand.

For conversion between ndarray, nalgebra and image check out nshare.

Dependencies

~0.4–1.3MB
~26K SLoC