Struct ArrayBase
pub struct ArrayBase<S, D> where S: Data, { /* fields omitted */ }
An n-dimensional array.
The array is a general container of elements. It cannot grow or shrink, but can be sliced into subsets of its data. The array supports arithmetic operations by applying them elementwise.
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 is accessed by using that many indices.
The ArrayBase<S, D> is parameterized by S for the data container and D for the dimensionality.
ArrayBase<S, D>
S
D
Type aliases Array, ArcArray, ArrayView, and ArrayViewMut refer to ArrayBase with different types for the data container.
Array
ArcArray
ArrayView
ArrayViewMut
ArrayBase
Array is an owned array that owns the underlying array elements directly (just like a Vec) and it is the default way to create and store n-dimensional data. Array<A, D> has two type parameters: A for the element type, and D for the dimensionality. A particular dimensionality's type alias like Array3<A> just has the type parameter A for element type.
Vec
Array<A, D>
A
Array3<A>
An example:
// Create a three-dimensional f64 array, initialized with zeros use ndarray::Array3; let mut temperature = Array3::<f64>::zeros((3, 4, 5)); // Increase the temperature in this location temperature[[2, 2, 2]] += 0.5;
ArcArray is an owned array with reference counted data (shared ownership). Sharing requires that it uses copy-on-write for mutable operations. Calling a method for mutating elements on ArcArray, for example view_mut() or get_mut(), will break sharing and require a clone of the data (if it is not uniquely held).
view_mut()
get_mut()
ArrayView and ArrayViewMut are read-only and read-write array views respectively. They use dimensionality, indexing, and almost all other methods the same was as the other array types.
Methods for ArrayBase apply to array views too, when the trait bounds allow.
Please see the documentation for the respective array view for an overview of methods specific to array views: ArrayView, ArrayViewMut.
A view is created from an array using .view(), .view_mut(), using slicing (.slice(), .slice_mut()) or from one of the many iterators that yield array views.
.view()
.view_mut()
.slice()
.slice_mut()
You can also create an array view from a regular slice of data not allocated with Array — see array view methods or their From impls.
From
Note that all ArrayBase variants can change their view (slicing) of the data freely, even when their data can’t be mutated.
The dimensionality of the array determines the number of axes, for example a 2D array has two axes. These are listed in “big endian” order, so that the greatest dimension is listed first, the lowest dimension with the most rapidly varying index is the last.
In a 2D array the index of each element is [row, column] as seen in this 4 × 3 example:
[row, column]
[[ [0, 0], [0, 1], [0, 2] ], // row 0 [ [1, 0], [1, 1], [1, 2] ], // row 1 [ [2, 0], [2, 1], [2, 2] ], // row 2 [ [3, 0], [3, 1], [3, 2] ]] // row 3 // \ \ \ // column 0 \ column 2 // column 1
The number of axes for an array is fixed by its D type parameter: Ix1 for a 1D array, Ix2 for a 2D array etc. The dimension type IxDyn allows a dynamic number of axes.
Ix1
Ix2
IxDyn
A fixed size array ([usize; N]) of the corresponding dimensionality is used to index the Array, making the syntax array[[ i, j, ...]]
[usize; N]
array[[
]]
use ndarray::Array2; let mut array = Array2::zeros((4, 3)); array[[1, 1]] = 7;
Important traits and types for dimension and indexing:
Dim
Dimension
IntoDimension
ShapeBuilder
NdIndex
The default memory order of an array is row major order (a.k.a “c” order), where each row is contiguous in memory. A column major (a.k.a. “f” or fortran) memory order array has columns (or, in general, the outermost axis) with contiguous elements.
The logical order of any array’s elements is the row major order (the rightmost index is varying the fastest). The iterators .iter(), .iter_mut() always adhere to this order, for example.
.iter(), .iter_mut()
Using Zip is the most general way to apply a procedure across one or several arrays or producers.
Zip
NdProducer is like an iterable but for multidimensional data. All producers have dimensions and axes, like an array view, and they can be split and used with parallelization using Zip.
NdProducer
For example, ArrayView<A, D> is a producer, it has the same dimensions as the array view and for each iteration it produces a reference to the array element (&A in this case).
ArrayView<A, D>
&A
Another example, if we have a 10 × 10 array and use .exact_chunks((2, 2)) we get a producer of chunks which has the dimensions 5 × 5 (because there are 10 / 2 = 5 chunks in either direction). The 5 × 5 chunks producer can be paired with any other producers of the same dimension with Zip, for example 5 × 5 arrays.
.exact_chunks((2, 2))
.iter()
.iter_mut()
These are the element iterators of arrays and they produce an element sequence in the logical order of the array, that means that the elements will be visited in the sequence that corresponds to increasing the last index first: 0, ..., 0, 0; 0, ..., 0, 1; 0, ...0, 2 and so on.
.outer_iter()
.axis_iter()
These iterators produce array views of one smaller dimension.
For example, for a 2D array, .outer_iter() will produce the 1D rows. For a 3D array, .outer_iter() produces 2D subviews.
.axis_iter() is like outer_iter() but allows you to pick which axis to traverse.
outer_iter()
The outer_iter and axis_iter are one dimensional producers.
outer_iter
axis_iter
.genrows()
.gencolumns()
.lanes()
.genrows() is a producer (and iterable) of all rows in an array.
use ndarray::Array; // 1. Loop over the rows of a 2D array let mut a = Array::zeros((10, 10)); for mut row in a.genrows_mut() { row.fill(1.); } // 2. Use Zip to pair each row in 2D `a` with elements in 1D `b` use ndarray::Zip; let mut b = Array::zeros(a.rows()); Zip::from(a.genrows()) .and(&mut b) .apply(|a_row, b_elt| { *b_elt = a_row[a.cols() - 1] - a_row[0]; });
The lanes of an array are 1D segments along an axis and when pointed along the last axis they are rows, when pointed along the first axis they are columns.
A m × n array has m rows each of length n and conversely n columns each of length m.
To generalize this, we say that an array of dimension a × m × n has a m rows. It's composed of a times the previous array, so it has a times as many rows.
All methods: .genrows(), .genrows_mut(), .gencolumns(), .gencolumns_mut(), .lanes(axis), .lanes_mut(axis).
.genrows_mut()
.gencolumns_mut()
.lanes(axis)
.lanes_mut(axis)
Yes, for 2D arrays .genrows() and .outer_iter() have about the same effect:
genrows()
You can use slicing to create a view of a subset of the data in the array. Slicing methods include .slice(), .slice_mut(), .slice_move(), and .slice_inplace().
.slice_move()
.slice_inplace()
The slicing argument can be passed using the macro s![], which will be used in all examples. (The explicit form is an instance of &SliceInfo; see its docs for more information.)
s![]
&SliceInfo
If a range is used, the axis is preserved. If an index is used, a subview is taken with respect to the axis. See Subviews for more information about subviews. Note that .slice_inplace() behaves like .subview_inplace() by preserving the number of dimensions.
.subview_inplace()
// import the s![] macro #[macro_use(s)] extern crate ndarray; use ndarray::{arr2, arr3}; fn main() { // 2 submatrices of 2 rows with 3 elements per row, means a shape of `[2, 2, 3]`. let a = arr3(&[[[ 1, 2, 3], // -- 2 rows \_ [ 4, 5, 6]], // -- / [[ 7, 8, 9], // \_ 2 submatrices [10, 11, 12]]]); // / // 3 columns ..../.../.../ assert_eq!(a.shape(), &[2, 2, 3]); // Let’s create a slice with // // - Both of the submatrices of the greatest dimension: `..` // - Only the first row in each submatrix: `0..1` // - Every element in each row: `..` let b = a.slice(s![.., 0..1, ..]); let c = arr3(&[[[ 1, 2, 3]], [[ 7, 8, 9]]]); assert_eq!(b, c); assert_eq!(b.shape(), &[2, 1, 3]); // Let’s create a slice with // // - Both submatrices of the greatest dimension: `..` // - The last row in each submatrix: `-1..` // - Row elements in reverse order: `..;-1` let d = a.slice(s![.., -1.., ..;-1]); let e = arr3(&[[[ 6, 5, 4]], [[12, 11, 10]]]); assert_eq!(d, e); assert_eq!(d.shape(), &[2, 1, 3]); // Let’s create a slice while taking a subview with // // - Both submatrices of the greatest dimension: `..` // - The last row in each submatrix, removing that axis: `-1` // - Row elements in reverse order: `..;-1` let f = a.slice(s![.., -1, ..;-1]); let g = arr2(&[[ 6, 5, 4], [12, 11, 10]]); assert_eq!(f, g); assert_eq!(f.shape(), &[2, 3]); }
Subview methods allow you to restrict the array view while removing one axis from the array. Subview methods include .subview(), .subview_mut(), .into_subview(), and .subview_inplace(). You can also take a subview by using a single index instead of a range when slicing.
.subview()
.subview_mut()
.into_subview()
Subview takes two arguments: axis and index.
axis
index
#[macro_use(s)] extern crate ndarray; use ndarray::{arr3, aview1, aview2, Axis}; // 2 submatrices of 2 rows with 3 elements per row, means a shape of `[2, 2, 3]`. let a = arr3(&[[[ 1, 2, 3], // \ axis 0, submatrix 0 [ 4, 5, 6]], // / [[ 7, 8, 9], // \ axis 0, submatrix 1 [10, 11, 12]]]); // / // \ // axis 2, column 0 assert_eq!(a.shape(), &[2, 2, 3]); // Let’s take a subview along the greatest dimension (axis 0), // taking submatrix 0, then submatrix 1 let sub_0 = a.subview(Axis(0), 0); let sub_1 = a.subview(Axis(0), 1); assert_eq!(sub_0, aview2(&[[ 1, 2, 3], [ 4, 5, 6]])); assert_eq!(sub_1, aview2(&[[ 7, 8, 9], [10, 11, 12]])); assert_eq!(sub_0.shape(), &[2, 3]); // This is the subview picking only axis 2, column 0 let sub_col = a.subview(Axis(2), 0); assert_eq!(sub_col, aview2(&[[ 1, 4], [ 7, 10]])); // You can take multiple subviews at once (and slice at the same time) let double_sub = a.slice(s![1, .., 0]); assert_eq!(double_sub, aview1(&[7, 10]));
.subview_inplace() modifies the view in the same way as .subview(), but since it is in place, it cannot remove the collapsed axis. It becomes an axis of length 1.
.outer_iter() is an iterator of every subview along the zeroth (outer) axis, while .axis_iter() is an iterator of every subview along a specific axis.
Arrays support all arithmetic operations the same way: they apply elementwise.
Since the trait implementations are hard to overview, here is a summary.
Let A be an array or view of any kind. Let B be an array with owned storage (either Array or ArcArray). Let C be an array with mutable data (either Array, ArcArray or ArrayViewMut). The following combinations of operands are supported for an arbitrary binary operator denoted by @ (it can be +, -, *, / and so on).
B
C
@
+
-
*
/
&A @ &A
B @ A
B @ &A
C @= &A
The trait ScalarOperand marks types that can be used in arithmetic with arrays directly. For a scalar K the following combinations of operands are supported (scalar can be on either the left or right side, but ScalarOperand docs has the detailed condtions).
ScalarOperand
K
&A @ K
K @ &A
B @ K
K @ B
C @= K
Let A be an array or view of any kind. Let B be an array with owned storage (either Array or ArcArray). The following operands are supported for an arbitrary unary operator denoted by @ (it can be - or !).
!
@&A
@B
Arrays support limited broadcasting, where arithmetic operations with array operands of different sizes can be carried out by repeating the elements of the smaller dimension array. See .broadcast() for a more detailed description.
.broadcast()
use ndarray::arr2; let a = arr2(&[[1., 1.], [1., 2.], [0., 3.], [0., 4.]]); let b = arr2(&[[0., 1.]]); let c = arr2(&[[1., 2.], [1., 3.], [0., 4.], [0., 5.]]); // We can add because the shapes are compatible even if not equal. // The `b` array is shape 1 × 2 but acts like a 4 × 2 array. assert!( c == a + b );
impl<S, A>
Note that the constructor methods apply to Array and RcArray, the two array types that have owned storage.
RcArray
Create a one-dimensional array from a vector (no copying needed).
use ndarray::Array; let array = Array::from_vec(vec![1., 2., 3., 4.]);
pub fn from_iter<I>(iterable: I) -> Self where I: [src]
Create a one-dimensional array from an iterable.
use ndarray::{Array, arr1}; let array = Array::from_iter((0..5).map(|x| x * x)); assert!(array == arr1(&[0, 1, 4, 9, 16]))
pub fn linspace(start: A, end: A, n: [src]
Create a one-dimensional array from the inclusive interval [start, end] with n elements. A must be a floating point type.
[start, end]
n
use ndarray::{Array, arr1}; let array = Array::linspace(0., 1., 5); assert!(array == arr1(&[0.0, 0.25, 0.5, 0.75, 1.0]))
pub fn range(start: A, end: A, step: A) -> Self where A: [src]
Create a one-dimensional array from the half-open interval [start, end) with elements spaced by step. A must be a floating point type.
[start, end)
step
use ndarray::{Array, arr1}; let array = Array::range(0., 5., 1.); assert!(array == arr1(&[0., 1., 2., 3., 4.]))
Create an identity matrix of size n (square 2D array).
Panics if n * n would overflow usize.
n * n
impl<S, A, D>
The shape argument can be an integer or a tuple of integers to specify a static size. For example 10 makes a length 10 one-dimensional array (dimension type Ix1) and (5, 6) a 5 × 6 array (dimension type Ix2).
shape
10
(5, 6)
With the trait ShapeBuilder in scope, there is the method .f() to select column major (“f” order) memory layout instead of the default row major. For example Array::zeros((5, 6).f()) makes a column major 5 × 6 array.
.f()
Array::zeros((5, 6).f())
Use IxDyn for the shape to create an array with dynamic number of axes.
Finally, the few constructors that take a completely general Into<StrideShape> argument optionally support custom strides, for example a shape given like (10, 2, 2).strides((1, 10, 20)) is valid.
Into<StrideShape>
(10, 2, 2).strides((1, 10, 20))
pub fn from_elem<Sh>(shape: Sh, elem: A) -> Self where A: [src]
Create an array with copies of elem, shape shape.
elem
Panics if the number of elements in shape would overflow usize.
use ndarray::{Array, arr3, ShapeBuilder}; let a = Array::from_elem((2, 2, 2), 1.); assert!( a == arr3(&[[[1., 1.], [1., 1.]], [[1., 1.], [1., 1.]]]) ); assert!(a.strides() == &[4, 2, 1]); let b = Array::from_elem((2, 2, 2).f(), 1.); assert!(b.strides() == &[1, 2, 4]);
pub fn zeros<Sh>(shape: Sh) -> Self where A: [src]
Create an array with zeros, shape shape.
pub fn ones<Sh>(shape: Sh) -> Self where A: [src]
Create an array with ones, shape shape.
pub fn default<Sh>(shape: Sh) -> Self where A: [src]
Create an array with default values, shape shape
pub fn from_shape_fn<Sh, F>(shape: Sh, f: F) -> Self where Sh: [src]
Create an array with values created by the function f.
f
f is called with the index of the element to create; the elements are visited in arbitirary order.
pub fn from_shape_vec<Sh>(shape: Sh, v: [src]
Create an array with the given shape from a vector. (No cloning of elements needed.)
For a contiguous c- or f-order shape, the following applies:
Errors if shape does not correspond to the number of elements in v.
v
For custom strides, the following applies:
Errors if strides and dimensions can point out of bounds of v. Errors if strides allow multiple indices to point to the same element.
use ndarray::Array; use ndarray::ShapeBuilder; // Needed for .strides() method use ndarray::arr2; let a = Array::from_shape_vec((2, 2), vec![1., 2., 3., 4.]); assert!(a.is_ok()); let b = Array::from_shape_vec((2, 2).strides((1, 2)), vec![1., 2., 3., 4.]).unwrap(); assert!( b == arr2(&[[1., 3.], [2., 4.]]) );
pub unsafe fn from_shape_vec_unchecked<Sh>(shape: Sh, v: [src]
Create an array from a vector and interpret it according to the provided dimensions and strides. (No cloning of elements needed.)
Unsafe because dimension and strides are unchecked.
pub unsafe fn uninitialized<Sh>(shape: Sh) -> Self where A: [src]
Create an array with uninitalized elements, shape shape.
Accessing uninitalized values is undefined behaviour. You must overwrite all the elements in the array after it is created; for example using the methods .fill() or .assign().
.fill()
.assign()
The contents of the array is indeterminate before initialization and it is an error to perform operations that use the previous values. For example it would not be legal to use a += 1.; on such an array.
a += 1.;
This constructor is limited to elements where A: Copy (no destructors) to avoid users shooting themselves too hard in the foot; it is not a problem to drop an array created with this method even before elements are initialized. (Note that constructors from_shape_vec and from_shape_vec_unchecked allow the user yet more control).
A: Copy
from_shape_vec
from_shape_vec_unchecked
#[macro_use(s)] extern crate ndarray; use ndarray::Array2; // Example Task: Let's create a column shifted copy of a in b fn shift_by_two(a: &Array2<f32>) -> Array2<f32> { let mut b = unsafe { Array2::uninitialized(a.dim()) }; // two first columns in b are two last in a // rest of columns in b are the initial columns in a b.slice_mut(s![.., ..2]).assign(&a.slice(s![.., -2..])); b.slice_mut(s![.., 2..]).assign(&a.slice(s![.., ..-2])); // `b` is safe to use with all operations at this point b }
impl<A, S, D>
Return the total number of elements in the array.
pub fn len_of(&self, axis: [src]
Return the length of axis.
The axis should be in the range Axis( 0 .. n ) where n is the number of dimensions (axes) of the array.
Axis(
)
Panics if the axis is out of bounds.
pub fn is_empty(&self) -> [src]
Return whether the array has any elements
pub fn ndim(&self) -> [src]
Return the number of dimensions (axes) in the array
pub fn dim(&self) -> D::[src]
Return the shape of the array in its “pattern” form, an integer in the one-dimensional case, tuple in the n-dimensional cases and so on.
pub fn raw_dim(&self) -> D
Return the shape of the array as it stored in the array.
pub fn shape(&self) -> [src]
Return the shape of the array as a slice.
pub fn strides(&self) -> [src]
Return the strides of the array as a slice
pub fn view(&self) -> [src]
Return a read-only view of the array
pub fn view_mut(&mut self) -> [src]
Return a read-write view of the array
pub fn to_owned(&self) -> [src]
Return an uniquely owned copy of the array.
If the input array is contiguous and its strides are positive, then the output array will have the same memory layout. Otherwise, the layout of the output array is unspecified. If you need a particular layout, you can allocate a new array with the desired memory layout and .assign() the data. Alternatively, you can collect an iterator, like this for a result in standard layout:
Array::from_shape_vec(arr.raw_dim(), arr.iter().cloned().collect()).unwrap()
or this for a result in column-major (Fortran) layout:
Array::from_shape_vec(arr.raw_dim().f(), arr.t().iter().cloned().collect()).unwrap()
pub fn to_shared(&self) -> [src]
Return a shared ownership (copy on write) array.
pub fn into_owned(self) -> [src]
Turn the array into a uniquely owned array, cloning the array elements to unshare them if necessary.
pub fn into_shared(self) -> [src]
Turn the array into a shared ownership (copy on write) array, without any copying.
Return an iterator of references to the elements of the array.
Elements are visited in the logical order of the array, which is where the rightmost index is varying the fastest.
Iterator element type is &A.
Return an iterator of mutable references to the elements of the array.
Iterator element type is &mut A.
&mut A
Return an iterator of indexes and references to the elements of the array.
Iterator element type is (D::Pattern, &A).
(D::Pattern, &A)
See also Zip::indexed
Zip::indexed
Return an iterator of indexes and mutable references to the elements of the array.
Iterator element type is (D::Pattern, &mut A).
(D::Pattern, &mut A)
pub fn slice<Do>(&self, info: &[src]
Return a sliced view of the array.
See Slicing for full documentation. See also SliceInfo and D::SliceArg.
SliceInfo
D::SliceArg
Panics if an index is out of bounds or step size is zero. (Panics if D is IxDyn and info does not match the number of array axes.)
info
pub fn slice_mut<Do>( &mut self, info: &[src]
Return a sliced read-write view of the array.
pub fn slice_move<Do>( self, info: &[src]
Slice the array, possibly changing the number of dimensions.
pub fn slice_inplace(&mut self, indices: &D::[src]
Slice the array in place without changing the number of dimensions.
Note that &SliceInfo (produced by the s![] macro) will usually coerce into &D::SliceArg automatically, but in some cases (e.g. if D is IxDyn), you may need to call .as_ref().
&D::SliceArg
.as_ref()
See Slicing for full documentation. See also D::SliceArg.
Panics if an index is out of bounds or step size is zero. (Panics if D is IxDyn and indices does not match the number of array axes.)
indices
pub fn slice_axis(&self, axis: [src]
Return a view of the array, sliced along the specified axis.
Panics if an index is out of bounds or step size is zero. Panics if axis is out of bounds.
pub fn slice_axis_mut( &mut self, axis: [src]
Return a mutable view of the array, sliced along the specified axis.
pub fn slice_axis_inplace(&mut self, axis: [src]
Slice the array in place along the specified axis.
pub fn get<I>(&self, index: I) -> [src]
Return a reference to the element at index, or return None if the index is out of bounds.
None
Arrays also support indexing syntax: array[index].
array[index]
use ndarray::arr2; let a = arr2(&[[1., 2.], [3., 4.]]); assert!( a.get((0, 1)) == Some(&2.) && a.get((0, 2)) == None && a[(0, 1)] == 2. && a[[0, 1]] == 2. );
pub fn get_mut<I>(&mut self, index: I) -> [src]
Return a mutable reference to the element at index, or return None if the index is out of bounds.
pub unsafe fn uget<I>(&self, index: I) -> [src]
Perform unchecked array indexing.
Return a reference to the element at index.
Note: only unchecked for non-debug builds of ndarray.
pub unsafe fn uget_mut<I>(&mut self, index: I) -> [src]
Return a mutable reference to the element at index.
Note: Only unchecked for non-debug builds of ndarray. Note: (For RcArray) The array must be uniquely held when mutating it.
pub fn swap<I>(&mut self, index1: I, index2: I) where S: [src]
Swap elements at indices index1 and index2.
index1
index2
Indices may be equal.
Panics if an index is out of bounds.
pub unsafe fn uswap<I>(&mut self, index1: I, index2: I) where S: [src]
Swap elements unchecked at indices index1 and index2.
Note: only unchecked for non-debug builds of ndarray. Note: (For RcArray) The array must be uniquely held.
pub fn subview(&self, axis: [src]
Along axis, select the subview index and return a view with that axis removed.
See Subviews for full documentation.
Panics if axis or index is out of bounds.
use ndarray::{arr2, ArrayView, Axis}; let a = arr2(&[[1., 2. ], // ... axis 0, row 0 [3., 4. ], // --- axis 0, row 1 [5., 6. ]]); // ... axis 0, row 2 // . \ // . axis 1, column 1 // axis 1, column 0 assert!( a.subview(Axis(0), 1) == ArrayView::from(&[3., 4.]) && a.subview(Axis(1), 1) == ArrayView::from(&[2., 4., 6.]) );
pub fn subview_mut( &mut self, axis: [src]
Along axis, select the subview index and return a read-write view with the axis removed.
use ndarray::{arr2, aview2, Axis}; let mut a = arr2(&[[1., 2. ], [3., 4. ]]); // . \ // . axis 1, column 1 // axis 1, column 0 { let mut column1 = a.subview_mut(Axis(1), 1); column1 += 10.; } assert!( a == aview2(&[[1., 12.], [3., 14.]]) );
pub fn subview_inplace(&mut self, axis: [src]
Collapse dimension axis into length one, and select the subview of index along that axis.
Panics if index is past the length of the axis.
pub fn into_subview(self, axis: [src]
Along axis, select the subview index and return self with that axis removed.
self
See .subview() and Subviews for full documentation.
pub fn select(&self, axis: [src]
Along axis, select arbitrary subviews corresponding to indices and and copy them into a new array.
Panics if axis or an element of indices is out of bounds.
use ndarray::{arr2, Axis}; let x = arr2(&[[0., 1.], [2., 3.], [4., 5.], [6., 7.], [8., 9.]]); let r = x.select(Axis(0), &[0, 4, 3]); assert!( r == arr2(&[[0., 1.], [8., 9.], [6., 7.]]) );
pub fn genrows(&self) -> [src]
Return a producer and iterable that traverses over the generalized rows of the array. For a 2D array these are the regular rows.
This is equivalent to .lanes(Axis(n - 1)) where n is self.ndim().
.lanes(Axis(n - 1))
self.ndim()
For an array of dimensions a × b × c × ... × l × m it has a × b × c × ... × l rows each of length m.
For example, in a 2 × 2 × 3 array, each row is 3 elements long and there are 2 × 2 = 4 rows in total.
Iterator element is ArrayView1<A> (1D array view).
ArrayView1<A>
use ndarray::{arr3, Axis, arr1}; let a = arr3(&[[[ 0, 1, 2], // -- row 0, 0 [ 3, 4, 5]], // -- row 0, 1 [[ 6, 7, 8], // -- row 1, 0 [ 9, 10, 11]]]); // -- row 1, 1 // `genrows` will yield the four generalized rows of the array. for row in a.genrows() { /* loop body */ }
pub fn genrows_mut(&mut self) -> [src]
Return a producer and iterable that traverses over the generalized rows of the array and yields mutable array views.
Iterator element is ArrayView1<A> (1D read-write array view).
pub fn gencolumns(&self) -> [src]
Return a producer and iterable that traverses over the generalized columns of the array. For a 2D array these are the regular columns.
This is equivalent to .lanes(Axis(0)).
.lanes(Axis(0))
For an array of dimensions a × b × c × ... × l × m it has b × c × ... × l × m columns each of length a.
For example, in a 2 × 2 × 3 array, each column is 2 elements long and there are 2 × 3 = 6 columns in total.
use ndarray::{arr3, Axis, arr1}; // The generalized columns of a 3D array: // are directed along the 0th axis: 0 and 6, 1 and 7 and so on... let a = arr3(&[[[ 0, 1, 2], [ 3, 4, 5]], [[ 6, 7, 8], [ 9, 10, 11]]]); // Here `gencolumns` will yield the six generalized columns of the array. for row in a.gencolumns() { /* loop body */ }
pub fn gencolumns_mut(&mut self) -> [src]
Return a producer and iterable that traverses over the generalized columns of the array and yields mutable array views.
pub fn lanes(&self, axis: [src]
Return a producer and iterable that traverses over all 1D lanes pointing in the direction of axis.
When the pointing in the direction of the first axis, they are columns, in the direction of the last axis rows; in general they are all lanes and are one dimensional.
use ndarray::{arr3, aview1, Axis}; let a = arr3(&[[[ 0, 1, 2], [ 3, 4, 5]], [[ 6, 7, 8], [ 9, 10, 11]]]); let inner0 = a.lanes(Axis(0)); let inner1 = a.lanes(Axis(1)); let inner2 = a.lanes(Axis(2)); // The first lane for axis 0 is [0, 6] assert_eq!(inner0.into_iter().next().unwrap(), aview1(&[0, 6])); // The first lane for axis 1 is [0, 3] assert_eq!(inner1.into_iter().next().unwrap(), aview1(&[0, 3])); // The first lane for axis 2 is [0, 1, 2] assert_eq!(inner2.into_iter().next().unwrap(), aview1(&[0, 1, 2]));
pub fn lanes_mut(&mut self, axis: [src]
Iterator element is ArrayViewMut1<A> (1D read-write array view).
ArrayViewMut1<A>
Return an iterator that traverses over the outermost dimension and yields each subview.
This is equivalent to .axis_iter(Axis(0)).
.axis_iter(Axis(0))
Iterator element is ArrayView<A, D::Smaller> (read-only array view).
ArrayView<A, D::Smaller>
This is equivalent to .axis_iter_mut(Axis(0)).
.axis_iter_mut(Axis(0))
Iterator element is ArrayViewMut<A, D::Smaller> (read-write array view).
ArrayViewMut<A, D::Smaller>
Return an iterator that traverses over axis and yields each subview along it.
For example, in a 3 × 4 × 5 array, with axis equal to Axis(2), the iterator element is a 3 × 4 subview (and there are 5 in total), as shown in the picture below.
Axis(2)
Panics if axis is out of bounds.
Return an iterator that traverses over axis and yields each mutable subview along it.
Return an iterator that traverses over axis by chunks of size, yielding non-overlapping views along that axis.
size
Iterator element is ArrayView<A, D>
The last view may have less elements if size does not divide the axis' dimension.
use ndarray::Array; use ndarray::{arr3, Axis}; let a = Array::from_iter(0..28).into_shape((2, 7, 2)).unwrap(); let mut iter = a.axis_chunks_iter(Axis(1), 2); // first iteration yields a 2 × 2 × 2 view assert_eq!(iter.next().unwrap(), arr3(&[[[ 0, 1], [ 2, 3]], [[14, 15], [16, 17]]])); // however the last element is a 2 × 1 × 2 view since 7 % 2 == 1 assert_eq!(iter.next_back().unwrap(), arr3(&[[[12, 13]], [[26, 27]]]));
Return an iterator that traverses over axis by chunks of size, yielding non-overlapping read-write views along that axis.
Iterator element is ArrayViewMut<A, D>
ArrayViewMut<A, D>
pub fn exact_chunks<E>(&self, chunk_size: E) -> [src]
Return an exact chunks producer (and iterable).
It produces the whole chunks of a given n-dimensional chunk size, skipping the remainder along each dimension that doesn't fit evenly.
The produced element is a ArrayView<A, D> with exactly the dimension chunk_size.
chunk_size
Panics if any dimension of chunk_size is zero (Panics if D is IxDyn and chunk_size does not match the number of array axes.)
pub fn exact_chunks_mut<E>(&mut self, chunk_size: E) -> [src]
The produced element is a ArrayViewMut<A, D> with exactly the dimension chunk_size.
use ndarray::Array; use ndarray::arr2; let mut a = Array::zeros((6, 7)); // Fill each 2 × 2 chunk with the index of where it appeared in iteration for (i, mut chunk) in a.exact_chunks_mut((2, 2)).into_iter().enumerate() { chunk.fill(i); } // The resulting array is: assert_eq!( a, arr2(&[[0, 0, 1, 1, 2, 2, 0], [0, 0, 1, 1, 2, 2, 0], [3, 3, 4, 4, 5, 5, 0], [3, 3, 4, 4, 5, 5, 0], [6, 6, 7, 7, 8, 8, 0], [6, 6, 7, 7, 8, 8, 0]]));
pub fn windows<E>(&self, window_size: E) -> [src]
Return a window producer and iterable.
The windows are all distinct overlapping views of size window_size that fit into the array's shape.
window_size
Will yield over no elements if window size is larger than the actual array size of any dimension.
The produced element is an ArrayView<A, D> with exactly the dimension window_size.
Panics if any dimension of window_size is zero. (Panics if D is IxDyn and window_size does not match the number of array axes.)
pub fn diag(&self) -> [src]
Return an view of the diagonal elements of the array.
The diagonal is simply the sequence indexed by (0, 0, .., 0), (1, 1, ..., 1) etc as long as all axes have elements.
pub fn diag_mut(&mut self) -> [src]
Return a read-write view over the diagonal elements of the array.
pub fn into_diag(self) -> [src]
Return the diagonal as a one-dimensional array.
pub fn is_standard_layout(&self) -> [src]
Return true if the array data is laid out in contiguous “C order” in memory (where the last index is the most rapidly varying).
true
Return false otherwise, i.e the array is possibly not contiguous in memory, it has custom strides, etc.
false
pub fn as_ptr(&self) -> [src]
Return a pointer to the first element in the array.
Raw access to array elements needs to follow the strided indexing scheme: an element at multi-index I in an array with strides S is located at offset
Σ0 ≤ k < d Ik × Sk
where d is self.ndim().
pub fn as_mut_ptr(&mut self) -> [src]
Return a mutable pointer to the first element in the array.
pub fn as_slice(&self) -> [src]
Return the array’s data as a slice, if it is contiguous and in standard order. Return None otherwise.
If this function returns Some(_), then the element order in the slice corresponds to the logical order of the array’s elements.
Some(_)
pub fn as_slice_mut(&mut self) -> [src]
pub fn as_slice_memory_order(&self) -> [src]
Return the array’s data as a slice if it is contiguous, return None otherwise.
If this function returns Some(_), then the elements in the slice have whatever order the elements have in memory.
Implementation notes: Does not yet support negatively strided arrays.
pub fn as_slice_memory_order_mut(&mut self) -> [src]
pub fn into_shape<E>(self, shape: E) -> [src]
Transform the array into shape; any shape with the same number of elements is accepted, but the source array or view must be contiguous, otherwise we cannot rearrange the dimension.
Errors if the shapes don't have the same number of elements. Errors if the input array is not c- or f-contiguous.
use ndarray::{aview1, aview2}; assert!( aview1(&[1., 2., 3., 4.]).into_shape((2, 2)).unwrap() == aview2(&[[1., 2.], [3., 4.]]) );
pub fn reshape<E>(&self, shape: E) -> [src]
Note: Reshape is for RcArray only. Use .into_shape() for other arrays and array views.
.into_shape()
Transform the array into shape; any shape with the same number of elements is accepted.
May clone all elements if needed to arrange elements in standard layout (and break sharing).
Panics if shapes are incompatible.
use ndarray::{rcarr1, rcarr2}; assert!( rcarr1(&[1., 2., 3., 4.]).reshape((2, 2)) == rcarr2(&[[1., 2.], [3., 4.]]) );
pub fn into_dyn(self) -> [src]
Convert any array or array view to a dynamic dimensional array or array view (respectively).
use ndarray::{arr2, ArrayD}; let array: ArrayD<i32> = arr2(&[[1, 2], [3, 4]]).into_dyn();
pub fn into_dimensionality<D2>(self) -> [src]
Convert an array or array view to another with the same type, but different dimensionality type. Errors if the dimensions don't agree.
use ndarray::{ArrayD, Ix2, IxDyn}; // Create a dynamic dimensionality array and convert it to an Array2 // (Ix2 dimension type). let array = ArrayD::<f64>::zeros(IxDyn(&[10, 10])); assert!(array.into_dimensionality::<Ix2>().is_ok());
pub fn broadcast<E>(&self, dim: E) -> [src]
Act like a larger size and/or shape array by broadcasting into a larger shape, if possible.
Return None if shapes can not be broadcast together.
Background
Compare axes beginning with the last axis of each shape.
For example (1, 2, 4) can be broadcast into (7, 6, 2, 4) because its axes are either equal or 1 (or missing); while (2, 2) can not be broadcast into (2, 4).
The implementation creates a view with strides set to zero for the axes that are to be repeated.
The broadcasting documentation for Numpy has more information.
use ndarray::{aview1, aview2}; assert!( aview1(&[1., 0.]).broadcast((10, 2)).unwrap() == aview2(&[[1., 0.]; 10]) );
pub fn swap_axes(&mut self, ax: [src]
Swap axes ax and bx.
ax
bx
This does not move any data, it just adjusts the array’s dimensions and strides.
Panics if the axes are out of bounds.
use ndarray::arr2; let mut a = arr2(&[[1., 2., 3.]]); a.swap_axes(0, 1); assert!( a == arr2(&[[1.], [2.], [3.]]) );
pub fn permuted_axes<T>(self, axes: T) -> [src]
Permute the axes.
i in the j-th place in the axes sequence means self's i-th axis becomes self.permuted_axes()'s j-th axis
self.permuted_axes()
Panics if any of the axes are out of bounds, if an axis is missing, or if an axis is repeated more than once.
use ndarray::{arr2, Array3}; let a = arr2(&[[0, 1], [2, 3]]); assert_eq!(a.view().permuted_axes([1, 0]), a.t()); let b = Array3::<u8>::zeros((1, 2, 3)); assert_eq!(b.permuted_axes([1, 0, 2]).shape(), &[2, 1, 3]);
pub fn reversed_axes(self) -> [src]
Transpose the array by reversing axes.
Transposition reverses the order of the axes (dimensions and strides) while retaining the same data.
pub fn t(&self) -> [src]
Return a transposed view of the array.
This is a shorthand for self.view().reversed_axes().
self.view().reversed_axes()
See also the more general methods .reversed_axes() and .swap_axes().
.reversed_axes()
.swap_axes()
Return an iterator over the length and stride of each axis.
pub fn max_stride_axis(&self) -> [src]
Return the axis with the greatest stride (by absolute value), preferring axes with len > 1.
pub fn invert_axis(&mut self, axis: [src]
Reverse the stride of axis.
pub fn merge_axes(&mut self, take: [src]
If possible, merge in the axis take to into.
take
into
use ndarray::Array3; use ndarray::Axis; let mut a = Array3::<f64>::zeros((2, 3, 4)); a.merge_axes(Axis(1), Axis(2)); assert_eq!(a.shape(), &[2, 1, 12]);
Panics if an axis is out of bounds.
pub fn insert_axis(self, axis: [src]
Insert new array axis at axis and return the result.
use ndarray::{Array3, Axis, arr1, arr2}; // Convert a 1-D array into a row vector (2-D). let a = arr1(&[1, 2, 3]); let row = a.insert_axis(Axis(0)); assert_eq!(row, arr2(&[[1, 2, 3]])); // Convert a 1-D array into a column vector (2-D). let b = arr1(&[1, 2, 3]); let col = b.insert_axis(Axis(1)); assert_eq!(col, arr2(&[[1], [2], [3]])); // The new axis always has length 1. let b = Array3::<f64>::zeros((3, 4, 5)); assert_eq!(b.insert_axis(Axis(2)).shape(), &[3, 4, 1, 5]);
pub fn remove_axis(self, axis: [src]
Remove array axis axis and return the result.
pub fn assign<E: [src]
Perform an elementwise assigment to self from rhs.
rhs
If their shapes disagree, rhs is broadcast to the shape of self.
Panics if broadcasting isn’t possible.
pub fn fill(&mut self, x: A) where S: [src]
Perform an elementwise assigment to self from element x.
x
pub fn zip_mut_with<B, S2, E, F>(&mut self, rhs: &[src]
Traverse two arrays in unspecified order, in lock step, calling the closure f on each element pair.
pub fn fold<'a, F, B>(&'a self, init: B, f: F) -> B where F: [src]
Traverse the array elements and apply a fold, returning the resulting value.
Elements are visited in arbitrary order.
pub fn map<'a, B, F>(&'a self, f: F) -> [src]
Call f by reference on each element and create a new array with the new values.
Return an array with the same shape as self.
use ndarray::arr2; let a = arr2(&[[ 0., 1.], [-1., 2.]]); assert!( a.map(|x| *x >= 1.0) == arr2(&[[false, true], [false, true]]) );
pub fn map_mut<'a, B, F>(&'a mut self, f: F) -> [src]
Call f on a mutable reference of each element and create a new array with the new values.
pub fn mapv<B, F>(&self, f: F) -> [src]
Call f by value on each element and create a new array with the new values.
use ndarray::arr2; let a = arr2(&[[ 0., 1.], [-1., 2.]]); assert!( a.mapv(f32::abs) == arr2(&[[0., 1.], [1., 2.]]) );
pub fn mapv_into<F>(self, f: F) -> Self where S: [src]
Call f by value on each element, update the array with the new values and return it.
pub fn map_inplace<F>(&mut self, f: F) where S: [src]
Modify the array in place by calling f by mutable reference on each element.
pub fn mapv_inplace<F>(&mut self, f: F) where S: [src]
Modify the array in place by calling f by value on each element. The array is updated with the new values.
use ndarray::arr2; let mut a = arr2(&[[ 0., 1.], [-1., 2.]]); a.mapv_inplace(f32::exp); assert!( a.all_close(&arr2(&[[1.00000, 2.71828], [0.36788, 7.38906]]), 1e-5) );
pub fn visit<'a, F>(&'a self, f: F) where F: [src]
Visit each element in the array by calling f by reference on each element.
pub fn fold_axis<B, F>( &self, axis: [src]
Fold along an axis.
Combine the elements of each subview with the previous using the fold function and initial value init.
fold
init
Return the result as an Array.
pub fn map_axis<'a, B, F>( &'a self, axis: [src]
Reduce the values along an axis into just one value, producing a new array with one less dimension.
pub fn map_axis_mut<'a, B, F>( &'a mut self, axis: [src]
Reduce the values along an axis into just one value, producing a new array with one less dimension. 1-dimensional lanes are passed as mutable references to the reducer, allowing for side-effects.
impl<A, S>
pub fn to_vec(&self) -> [src]
Return an vector with the elements of the one-dimensional array.
pub fn row(&self, index: [src]
Return an array view of row index.
Panics if index is out of bounds.
pub fn row_mut(&mut self, index: [src]
Return a mutable array view of row index.
pub fn rows(&self) -> [src]
Return the number of rows (length of Axis(0)) in the two-dimensional array.
Axis(0)
pub fn column(&self, index: [src]
Return an array view of column index.
pub fn column_mut(&mut self, index: [src]
Return a mutable array view of column index.
pub fn cols(&self) -> [src]
Return the number of columns (length of Axis(1)) in the two-dimensional array.
Axis(1)
pub fn is_square(&self) -> [src]
Return true if the array is square, false otherwise.
Numerical methods for arrays.
pub fn scalar_sum(&self) -> A where A: [src]
Return the sum of all elements in the array.
use ndarray::arr2; let a = arr2(&[[1., 2.], [3., 4.]]); assert_eq!(a.scalar_sum(), 10.);
pub fn sum_axis(&self, axis: [src]
Return sum along axis.
use ndarray::{aview0, aview1, arr2, Axis}; let a = arr2(&[[1., 2.], [3., 4.]]); assert!( a.sum_axis(Axis(0)) == aview1(&[4., 6.]) && a.sum_axis(Axis(1)) == aview1(&[3., 7.]) && a.sum_axis(Axis(0)).sum_axis(Axis(0)) == aview0(&10.) );
pub fn mean_axis(&self, axis: [src]
Return mean along axis.
use ndarray::{aview1, arr2, Axis}; let a = arr2(&[[1., 2.], [3., 4.]]); assert!( a.mean_axis(Axis(0)) == aview1(&[2.0, 3.0]) && a.mean_axis(Axis(1)) == aview1(&[1.5, 3.5]) );
pub fn var_axis(&self, axis: [src]
Return variance along axis.
The variance is computed using the Welford one-pass algorithm.
The parameter ddof specifies the "delta degrees of freedom". For example, to calculate the population variance, use ddof = 0, or to calculate the sample variance, use ddof = 1.
ddof
ddof = 0
ddof = 1
The variance is defined as:
1 n variance = ―――――――― ∑ (xᵢ - x̅)² n - ddof i=1
where
1 n x̅ = ― ∑ xᵢ n i=1
Panics if ddof is greater than or equal to the length of the axis, if axis is out of bounds, or if the length of the axis is zero.
use ndarray::{aview1, arr2, Axis}; let a = arr2(&[[1., 2.], [3., 4.], [5., 6.]]); let var = a.var_axis(Axis(0), 1.); assert_eq!(var, aview1(&[4., 4.]));
pub fn all_close<S2, E>(&self, rhs: &[src]
Return true if the arrays' elementwise differences are all within the given absolute tolerance, false otherwise.
Panics if broadcasting to the same shape isn’t possible.
pub fn dot<Rhs>(&self, rhs: [src]
Perform dot product or matrix multiplication of arrays self and rhs.
Rhs may be either a one-dimensional or a two-dimensional array.
Rhs
If Rhs is one-dimensional, then the operation is a vector dot product, which is the sum of the elementwise products (no conjugation of complex operands, and thus not their inner product). In this case, self and rhs must be the same length.
If Rhs is two-dimensional, then the operation is matrix multiplication, where self is treated as a row vector. In this case, if self is shape M, then rhs is shape M × N and the result is shape N.
Panics if the array shapes are incompatible. Note: If enabled, uses blas dot for elements of f32, f64 when memory layout allows.
dot
f32, f64
Perform matrix multiplication of rectangular arrays self and rhs.
If Rhs is two-dimensional, they array shapes must agree in the way that if self is M × N, then rhs is N × K.
Return a result array with shape M × K.
Panics if shapes are incompatible. Note: If enabled, uses blas gemv/gemm for elements of f32, f64 when memory layout allows. The default matrixmultiply backend is otherwise used for f32, f64 for all memory layouts.
gemv/gemm
use ndarray::arr2; let a = arr2(&[[1., 2.], [0., 1.]]); let b = arr2(&[[1., 2.], [2., 3.]]); assert!( a.dot(&b) == arr2(&[[5., 8.], [2., 3.]]) );
pub fn scaled_add<S2, E>(&mut self, alpha: A, rhs: &[src]
Perform the operation self += alpha * rhs efficiently, where alpha is a scalar and rhs is another array. This operation is also known as axpy in BLAS.
self += alpha * rhs
alpha
axpy
impl<S, D, I>
Access the element at index.
type Output = S::Elem
The returned type after indexing.
fn index(&self, index: I) -> &S::[src]
Performs the indexing (container[index]) operation.
container[index]
Access the element at index mutably.
fn index_mut(&mut self, index: I) -> &mut S::[src]
Performs the mutable indexing (container[index]) operation.
impl<S, S2, D>
Return true if the array shapes and all elements of self and rhs are equal. Return false otherwise.
fn eq(&self, rhs: &[src]
This method tests for self and other values to be equal, and is used by ==. Read more
other
==
fn ne(&self, other: [src]
This method tests for !=.
!=
impl<S, D>
fn from_iter<I>(iterable: I) -> [src]
Creates a value from an iterator. Read more
impl<'a, S, D>
type Item = &'a S::Elem
The type of the elements being iterated over.
type IntoIter = Iter<'a, S::Elem, D>
Which kind of iterator are we turning this into?
fn into_iter(self) -> Self::[src]
Creates an iterator from a value. Read more
type Item = &'a mut S::Elem
type IntoIter = IterMut<'a, S::Elem, D>
fn hash<H: [src]
Feeds this value into the given [Hasher]. Read more
Hasher
fn hash_slice<H>(data: [src]
Feeds a slice of this type into the given [Hasher]. Read more
ArrayBase is Sync when the storage type is.
Sync
ArrayBase is Send when the storage type is.
Send
impl<'a, A, S, D>
Implementation of ArrayView::from(&A) where A is an array.
ArrayView::from(&A)
Create a read-only array view of the array.
fn from(array: &'a [src]
Performs the conversion.
Implementation of ArrayViewMut::from(&mut A) where A is an array.
ArrayViewMut::from(&mut A)
Create a read-write array view of the array.
fn from(array: &'a mut [src]
Create an owned array with a default state.
The array is created with dimension D::default(), which results in for example dimensions 0 and (0, 0) with zero elements for the one-dimensional and two-dimensional cases respectively.
D::default()
0
(0, 0)
The default dimension for IxDyn is IxDyn(&[0]) (array has zero elements). And the default for the dimension () is () (array has one element).
IxDyn(&[0])
()
Since arrays cannot grow, the intention is to use the default value as placeholder.
fn default() -> Self
Returns the "default value" for a type. Read more
impl<A, D, S>
Requires crate feature "serde-1"
"serde-1"
fn serialize<Se>(&self, serializer: Se) -> [src]
Serialize this value into the given Serde serializer. Read more
impl<'de, A, Di, S>
fn deserialize<D>(deserializer: D) -> [src]
Deserialize this value from the given Serde deserializer. Read more
Requires crate feature "rustc-serialize"
"rustc-serialize"
fn encode<E: [src]
Serialize a value using an Encoder.
Encoder
fn decode<E: [src]
Deserialize a value using a Decoder.
Decoder
impl<'a, A:
Format the array using Display and apply the formatting parameters used to each element.
Display
The array is shown in multiline style.
fn fmt(&self, f: &mut [src]
Formats the value using the given formatter. Read more
Format the array using Debug and apply the formatting parameters used to each element.
Debug
Format the array using LowerExp and apply the formatting parameters used to each element.
LowerExp
Formats the value using the given formatter.
Format the array using UpperExp and apply the formatting parameters used to each element.
UpperExp
Format the array using LowerHex and apply the formatting parameters used to each element.
LowerHex
Format the array using Binary and apply the formatting parameters used to each element.
Binary
impl<'a, A: 'a, S, D>
An array reference is an n-dimensional producer of element references (like ArrayView).
type Item = &'a A
The element produced per iteration.
type Dim = D
Dimension type of the producer
type Output = ArrayView<'a, A, D>
fn into_producer(self) -> Self::[src]
Convert the value into an NdProducer.
A mutable array reference is an n-dimensional producer of mutable element references (like ArrayViewMut).
type Item = &'a mut A
type Output = ArrayViewMut<'a, A, D>
impl<S:
fn clone(&self) -> [src]
Returns a copy of the value. Read more
fn clone_from(&mut self, other: [src]
Array implements .clone_from() to reuse an array's existing allocation. Semantically equivalent to *self = other.clone(), but potentially more efficient.
.clone_from()
*self = other.clone()
impl<A, S, S2>
type Output = A
The result of the operation. Read more
fn dot(&self, rhs: &[src]
Compute the dot product of one-dimensional arrays.
The dot product is a sum of the elementwise products (no conjugation of complex operands, and thus not their inner product).
Panics if the arrays are not of the same length. Note: If enabled, uses blas dot for elements of f32, f64 when memory layout allows.
type Output = Array<A, Ix1>
Perform the matrix multiplication of the row vector self and rectangular matrix rhs.
The array shapes must agree in the way that if self is M, then rhs is M × N.
Return a result array with shape N.
type Output = Array2<A>
fn dot(&self, b: &[src]
Perform the matrix multiplication of the rectangular array self and column vector rhs.
The array shapes must agree in the way that if self is M × N, then rhs is N.
Return a result array with shape M.
impl<A, S, S2, D, E>
Perform elementwise addition between self and rhs, and return the result (based on self).
self must be an Array or RcArray.
type Output = ArrayBase<S, D>
The resulting type after applying the + operator.
fn add(self, rhs: [src]
Performs the + operation.
impl<'a, A, S, S2, D, E>
Perform elementwise addition between self and reference rhs, and return the result (based on self).
fn add(self, rhs: &[src]
Perform elementwise addition between references self and rhs, and return the result as a new Array.
type Output = Array<A, D>
fn add(self, rhs: &'a [src]
impl<A, S, D, B>
Perform elementwise addition between self and the scalar x, and return the result (based on self).
fn add(self, x: B) -> [src]
impl<'a, A, S, D, B>
Perform elementwise addition between the reference self and the scalar x, and return the result as a new Array.
Perform elementwise subtraction between self and rhs, and return the result (based on self).
The resulting type after applying the - operator.
fn sub(self, rhs: [src]
Performs the - operation.
Perform elementwise subtraction between self and reference rhs, and return the result (based on self).
fn sub(self, rhs: &[src]
Perform elementwise subtraction between references self and rhs, and return the result as a new Array.
fn sub(self, rhs: &'a [src]
Perform elementwise subtraction between self and the scalar x, and return the result (based on self).
fn sub(self, x: B) -> [src]
Perform elementwise subtraction between the reference self and the scalar x, and return the result as a new Array.
Perform elementwise multiplication between self and rhs, and return the result (based on self).
The resulting type after applying the * operator.
fn mul(self, rhs: [src]
Performs the * operation.
Perform elementwise multiplication between self and reference rhs, and return the result (based on self).
fn mul(self, rhs: &[src]
Perform elementwise multiplication between references self and rhs, and return the result as a new Array.
fn mul(self, rhs: &'a [src]
Perform elementwise multiplication between self and the scalar x, and return the result (based on self).
fn mul(self, x: B) -> [src]
Perform elementwise multiplication between the reference self and the scalar x, and return the result as a new Array.
Perform elementwise division between self and rhs, and return the result (based on self).
The resulting type after applying the / operator.
fn div(self, rhs: [src]
Performs the / operation.
Perform elementwise division between self and reference rhs, and return the result (based on self).
fn div(self, rhs: &[src]
Perform elementwise division between references self and rhs, and return the result as a new Array.
fn div(self, rhs: &'a [src]
Perform elementwise division between self and the scalar x, and return the result (based on self).
fn div(self, x: B) -> [src]
Perform elementwise division between the reference self and the scalar x, and return the result as a new Array.
Perform elementwise remainder between self and rhs, and return the result (based on self).
The resulting type after applying the % operator.
%
fn rem(self, rhs: [src]
Performs the % operation.
Perform elementwise remainder between self and reference rhs, and return the result (based on self).
fn rem(self, rhs: &[src]
Perform elementwise remainder between references self and rhs, and return the result as a new Array.
fn rem(self, rhs: &'a [src]
Perform elementwise remainder between self and the scalar x, and return the result (based on self).
fn rem(self, x: B) -> [src]
Perform elementwise remainder between the reference self and the scalar x, and return the result as a new Array.
Perform elementwise bit and between self and rhs, and return the result (based on self).
The resulting type after applying the & operator.
&
fn bitand(self, rhs: [src]
Performs the & operation.
Perform elementwise bit and between self and reference rhs, and return the result (based on self).
fn bitand(self, rhs: &[src]
Perform elementwise bit and between references self and rhs, and return the result as a new Array.
fn bitand(self, rhs: &'a [src]
Perform elementwise bit and between self and the scalar x, and return the result (based on self).
fn bitand(self, x: B) -> [src]
Perform elementwise bit and between the reference self and the scalar x, and return the result as a new Array.
Perform elementwise bit or between self and rhs, and return the result (based on self).
The resulting type after applying the | operator.
|
fn bitor(self, rhs: [src]
Performs the | operation.
Perform elementwise bit or between self and reference rhs, and return the result (based on self).
fn bitor(self, rhs: &[src]
Perform elementwise bit or between references self and rhs, and return the result as a new Array.
fn bitor(self, rhs: &'a [src]
Perform elementwise bit or between self and the scalar x, and return the result (based on self).
fn bitor(self, x: B) -> [src]
Perform elementwise bit or between the reference self and the scalar x, and return the result as a new Array.
Perform elementwise bit xor between self and rhs, and return the result (based on self).
The resulting type after applying the ^ operator.
^
fn bitxor(self, rhs: [src]
Performs the ^ operation.
Perform elementwise bit xor between self and reference rhs, and return the result (based on self).
fn bitxor(self, rhs: &[src]
Perform elementwise bit xor between references self and rhs, and return the result as a new Array.
fn bitxor(self, rhs: &'a [src]
Perform elementwise bit xor between self and the scalar x, and return the result (based on self).
fn bitxor(self, x: B) -> [src]
Perform elementwise bit xor between the reference self and the scalar x, and return the result as a new Array.
Perform elementwise left shift between self and rhs, and return the result (based on self).
The resulting type after applying the << operator.
<<
fn shl(self, rhs: [src]
Performs the << operation.
Perform elementwise left shift between self and reference rhs, and return the result (based on self).
fn shl(self, rhs: &[src]
Perform elementwise left shift between references self and rhs, and return the result as a new Array.
fn shl(self, rhs: &'a [src]
Perform elementwise left shift between self and the scalar x, and return the result (based on self).
fn shl(self, x: B) -> [src]
Perform elementwise left shift between the reference self and the scalar x, and return the result as a new Array.
Perform elementwise right shift between self and rhs, and return the result (based on self).
The resulting type after applying the >> operator.
>>
fn shr(self, rhs: [src]
Performs the >> operation.
Perform elementwise right shift between self and reference rhs, and return the result (based on self).
fn shr(self, rhs: &[src]
Perform elementwise right shift between references self and rhs, and return the result as a new Array.
fn shr(self, rhs: &'a [src]
Perform elementwise right shift between self and the scalar x, and return the result (based on self).
fn shr(self, x: B) -> [src]
Perform elementwise right shift between the reference self and the scalar x, and return the result as a new Array.
type Output = Array<i8, D>
type Output = Array<u8, D>
type Output = Array<i16, D>
type Output = Array<u16, D>
type Output = Array<i32, D>
type Output = Array<u32, D>
type Output = Array<i64, D>
type Output = Array<u64, D>
type Output = Array<i128, D>
type Output = Array<u128, D>
type Output = Array<bool, D>
type Output = Array<f32, D>
type Output = Array<f64, D>
type Output = Array<Complex<f32>, D>
type Output = Array<Complex<f64>, D>
type Output = Self
fn neg(self) -> Self
Perform an elementwise negation of self and return the result.
fn neg(self) -> [src]
Perform an elementwise negation of reference self and return the result as a new Array.
The resulting type after applying the ! operator.
fn not(self) -> Self
Perform an elementwise unary not of self and return the result.
fn not(self) -> [src]
Perform an elementwise unary not of reference self and return the result as a new Array.
Perform self += rhs as elementwise addition (in place).
self += rhs
fn add_assign(&mut self, rhs: &[src]
Performs the += operation.
+=
fn add_assign(&mut self, rhs: A)
Perform self -= rhs as elementwise subtraction (in place).
self -= rhs
fn sub_assign(&mut self, rhs: &[src]
Performs the -= operation.
-=
fn sub_assign(&mut self, rhs: A)
Perform self *= rhs as elementwise multiplication (in place).
self *= rhs
fn mul_assign(&mut self, rhs: &[src]
Performs the *= operation.
*=
fn mul_assign(&mut self, rhs: A)
Perform self /= rhs as elementwise division (in place).
self /= rhs
fn div_assign(&mut self, rhs: &[src]
Performs the /= operation.
/=
fn div_assign(&mut self, rhs: A)
Perform self %= rhs as elementwise remainder (in place).
self %= rhs
fn rem_assign(&mut self, rhs: &[src]
Performs the %= operation.
%=
fn rem_assign(&mut self, rhs: A)
Perform self &= rhs as elementwise bit and (in place).
self &= rhs
fn bitand_assign(&mut self, rhs: &[src]
Performs the &= operation.
&=
fn bitand_assign(&mut self, rhs: A)
Perform self |= rhs as elementwise bit or (in place).
self |= rhs
fn bitor_assign(&mut self, rhs: &[src]
Performs the |= operation.
|=
fn bitor_assign(&mut self, rhs: A)
Perform self ^= rhs as elementwise bit xor (in place).
self ^= rhs
fn bitxor_assign(&mut self, rhs: &[src]
Performs the ^= operation.
^=
fn bitxor_assign(&mut self, rhs: A)
Perform self <<= rhs as elementwise left shift (in place).
self <<= rhs
fn shl_assign(&mut self, rhs: &[src]
Performs the <<= operation.
<<=
fn shl_assign(&mut self, rhs: A)
Perform self >>= rhs as elementwise right shift (in place).
self >>= rhs
fn shr_assign(&mut self, rhs: &[src]
Performs the >>= operation.
>>=
fn shr_assign(&mut self, rhs: A)