ndarray
=========
The ``ndarray`` crate provides an *n*-dimensional container for general elements
and for numerics.
Please read the `API documentation on docs.rs`__
or take a look at the `quickstart tutorial <./README-quick-start.md>`_.
__ https://docs.rs/ndarray/
|build_status|_ |crates|_ |matrix-chat|_ |irc|_
.. |build_status| image:: https://github.com/rust-ndarray/ndarray/actions/workflows/ci.yaml/badge.svg
:alt: CI build status
.. _build_status: https://github.com/rust-ndarray/ndarray/actions
.. |crates| image:: https://img.shields.io/crates/v/ndarray.svg
:alt: ndarray at crates.io
.. _crates: https://crates.io/crates/ndarray
.. |matrix-chat| image:: https://img.shields.io/badge/Matrix-%23rust--sci%3Amatrix.org-lightgrey
:alt: Matrix chat at #rust-sci:matrix.org
.. |irc| image:: https://img.shields.io/badge/IRC-%23rust--sci%20on%20OFTC-lightgrey
:alt: IRC at #rust-sci on OFTC
.. _irc: https://webchat.oftc.net/?channels=rust-sci
Highlights
----------
- Generic 1, 2, ..., *n*-dimensional arrays
- Owned arrays and array views
- 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.
Status and Lookout
------------------
- 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.
- Performance:
+ Prefer higher order methods and arithmetic operations on arrays first,
then iteration, and as a last priority using indexed algorithms.
+ Efficient floating point matrix multiplication even for very large
matrices; can optionally use BLAS to improve it further.
Crate Feature Flags
-------------------
The following crate feature flags are available. They are configured in
your `Cargo.toml`.
- ``std``
- Rust standard library (enabled by default)
- This crate can be used without the standard library by disabling the
default `std` feature. To do so, use this in your `Cargo.toml`:
::
[dependencies]
ndarray = { version = "0.x.y", default-features = false }
- The `geomspace` `linspace` `logspace` `range` `std` `var` `var_axis` and `std_axis`
methods are only available when `std` is enabled.
- ``serde``
- Enables serialization support for serde 1.x
- ``rayon``
- Enables parallel iterators, parallelized methods and ``par_azip!``.
- Implies std
- ``approx``
- Implementations of traits from version 0.5 of the [`approx`] crate.
- ``blas``
- Enable transparent BLAS support for matrix multiplication.
Uses ``blas-src`` for pluggable backend, which needs to be configured
separately (see below).
- ``matrixmultiply-threading``
- Enable the ``threading`` feature in the matrixmultiply package
- ``portable-atomic-critical-section``
- Whether ``portable-atomic`` should use ``critical-section``
How to use with cargo
---------------------
::
[dependencies]
ndarray = "0.16.0"
How to enable BLAS integration
------------------------------
Blas integration is an optional add-on. Without BLAS, ndarray uses the
``matrixmultiply`` crate for matrix multiplication for ``f64`` and ``f32``
arrays (and it's always enabled as a fallback since it supports matrices of
arbitrary strides in both dimensions).
Depend and link to ``blas-src`` directly to pick a blas provider. Ndarray
presently requires a blas provider that provides the ``cblas-sys`` interface. If
further feature selection is wanted or needed then you might need to depend directly on
the backend crate's source too. The backend version **must** be the one that
``blas-src`` also depends on.
An example configuration using system openblas is shown below. Note that only
end-user projects (not libraries) should select provider::
[dependencies]
ndarray = { version = "0.16.0", features = ["blas"] }
blas-src = { version = "0.10", features = ["openblas"] }
openblas-src = { version = "0.10", features = ["cblas", "system"] }
Using system-installed dependencies can save a long time building dependencies.
An example configuration using (compiled) netlib is shown below anyway::
[dependencies]
ndarray = { version = "0.16.0", features = ["blas"] }
blas-src = { version = "0.10.0", default-features = false, features = ["netlib"] }
When this is done, your program must also link to ``blas_src`` by using it or
explicitly including it in your code::
extern crate blas_src;
The following versions have been verified to work together. For ndarray 0.15 or later,
there is no tight coupling to the ``blas-src`` version, so version selection is more flexible.
=========== ============ ================ ==============
``ndarray`` ``blas-src`` ``openblas-src`` ``netlib-src``
=========== ============ ================ ==============
0.16 0.10 0.10 0.8
0.15 0.8 0.10 0.8
0.15 0.7 0.9 0.8
0.14 0.6.1 0.9.0
0.13 0.2.0 0.6.0
=========== ============ ================ ==============
Recent Changes
--------------
See `RELEASES.md <./RELEASES.md>`_.
License
=======
Dual-licensed to be compatible with the Rust project.
Licensed under the Apache License, Version 2.0
http://www.apache.org/licenses/LICENSE-2.0 or the MIT license
http://opensource.org/licenses/MIT, at your
option. This file may not be copied, modified, or distributed
except according to those terms.