Struct ndarray::Zip

source ·
pub struct Zip<Parts, D> { /* private fields */ }
Expand description

Lock step function application across several arrays or other producers.

Zip allows matching several producers to each other elementwise and applying a function over all tuples of elements (one item from each input at a time).

In general, the zip uses a tuple of producers (NdProducer trait) that all have to be of the same shape. The NdProducer implementation defines what its item type is (for example if it’s a shared reference, mutable reference or an array view etc).

If all the input arrays are of the same memory layout the zip performs much better and the compiler can usually vectorize the loop (if applicable).

The order elements are visited is not specified. The producers don’t have to have the same item type.

The Zip has two methods for function application: apply and fold_while. The zip object can be split, which allows parallelization. A read-only zip object (no mutable producers) can be cloned.

See also the azip!() macro which offers a convenient shorthand to common ways to use Zip.

use ndarray::Zip;
use ndarray::Array2;

type M = Array2<f64>;

// Create four 2d arrays of the same size
let mut a = M::zeros((64, 32));
let b = M::from_elem(a.dim(), 1.);
let c = M::from_elem(a.dim(), 2.);
let d = M::from_elem(a.dim(), 3.);

// Example 1: Perform an elementwise arithmetic operation across
// the four arrays a, b, c, d.

Zip::from(&mut a)
    .and(&b)
    .and(&c)
    .and(&d)
    .apply(|w, &x, &y, &z| {
        *w += x + y * z;
    });

// Example 2: Create a new array `totals` with one entry per row of `a`.
//  Use Zip to traverse the rows of `a` and assign to the corresponding
//  entry in `totals` with the sum across each row.
//  This is possible because the producer for `totals` and the row producer
//  for `a` have the same shape and dimensionality.
//  The rows producer yields one array view (`row`) per iteration.

use ndarray::{Array1, Axis};

let mut totals = Array1::zeros(a.rows());

Zip::from(&mut totals)
    .and(a.genrows())
    .apply(|totals, row| *totals = row.sum());

// Check the result against the built in `.sum_axis()` along axis 1.
assert_eq!(totals, a.sum_axis(Axis(1)));

Implementations§

Create a new Zip from the input array or other producer p.

The Zip will take the exact dimension of p and all inputs must have the same dimensions (or be broadcast to them).

Create a new Zip with an index producer and the producer p.

The Zip will take the exact dimension of p and all inputs must have the same dimensions (or be broadcast to them).

Note: Indexed zip has overhead.

Return a the number of element tuples in the Zip

Apply a function to all elements of the input arrays, visiting elements in lock step.

Apply a fold function to all elements of the input arrays, visiting elements in lock step.

The fold continues while the return value is a FoldWhile::Continue.

Include the producer p in the Zip.

Panics if p’s shape doesn’t match the Zip’s exactly.

Include the producer p in the Zip, broadcasting if needed.

If their shapes disagree, rhs is broadcast to the shape of self.

Panics if broadcasting isn’t possible.

Split the Zip evenly in two.

It will be split in the way that best preserves element locality.

Apply a function to all elements of the input arrays, visiting elements in lock step.

Apply a fold function to all elements of the input arrays, visiting elements in lock step.

The fold continues while the return value is a FoldWhile::Continue.

Include the producer p in the Zip.

Panics if p’s shape doesn’t match the Zip’s exactly.

Include the producer p in the Zip, broadcasting if needed.

If their shapes disagree, rhs is broadcast to the shape of self.

Panics if broadcasting isn’t possible.

Split the Zip evenly in two.

It will be split in the way that best preserves element locality.

Apply a function to all elements of the input arrays, visiting elements in lock step.

Apply a fold function to all elements of the input arrays, visiting elements in lock step.

The fold continues while the return value is a FoldWhile::Continue.

Include the producer p in the Zip.

Panics if p’s shape doesn’t match the Zip’s exactly.

Include the producer p in the Zip, broadcasting if needed.

If their shapes disagree, rhs is broadcast to the shape of self.

Panics if broadcasting isn’t possible.

Split the Zip evenly in two.

It will be split in the way that best preserves element locality.

Apply a function to all elements of the input arrays, visiting elements in lock step.

Apply a fold function to all elements of the input arrays, visiting elements in lock step.

The fold continues while the return value is a FoldWhile::Continue.

Include the producer p in the Zip.

Panics if p’s shape doesn’t match the Zip’s exactly.

Include the producer p in the Zip, broadcasting if needed.

If their shapes disagree, rhs is broadcast to the shape of self.

Panics if broadcasting isn’t possible.

Split the Zip evenly in two.

It will be split in the way that best preserves element locality.

Apply a function to all elements of the input arrays, visiting elements in lock step.

Apply a fold function to all elements of the input arrays, visiting elements in lock step.

The fold continues while the return value is a FoldWhile::Continue.

Include the producer p in the Zip.

Panics if p’s shape doesn’t match the Zip’s exactly.

Include the producer p in the Zip, broadcasting if needed.

If their shapes disagree, rhs is broadcast to the shape of self.

Panics if broadcasting isn’t possible.

Split the Zip evenly in two.

It will be split in the way that best preserves element locality.

Apply a function to all elements of the input arrays, visiting elements in lock step.

Apply a fold function to all elements of the input arrays, visiting elements in lock step.

The fold continues while the return value is a FoldWhile::Continue.

Split the Zip evenly in two.

It will be split in the way that best preserves element locality.

Trait Implementations§

Returns a copy of the value. Read more
Performs copy-assignment from source. Read more
Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Gets the TypeId of self. Read more
Immutably borrows from an owned value. Read more
Mutably borrows from an owned value. Read more

Returns the argument unchanged.

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

The resulting type after obtaining ownership.
Creates owned data from borrowed data, usually by cloning. Read more
Uses borrowed data to replace owned data, usually by cloning. Read more
The type returned in the event of a conversion error.
Performs the conversion.
The type returned in the event of a conversion error.
Performs the conversion.