mapReduce
Perform a single-pass map-reduce operation against each element in an array and return the accumulated result.
Usage
var mapReduce = require( '@stdlib/utils/map-reduce' );
mapReduce( arr, initial, mapper, reducer[, thisArg ] )
Performs a map-reduce operation against each element in an array and returns the accumulated result.
function square( value ) {
return value * value;
}
function sum( accumulator, value ) {
return accumulator + value;
}
var arr = [ 1, 2, 3, 4 ];
var out = mapReduce( arr, 0, square, sum );
// returns 30
The function accepts both array-like objects and ndarray
-like objects.
var array = require( '@stdlib/ndarray/array' );
function square( value ) {
return value * value;
}
function sum( accumulator, value ) {
return accumulator + value;
}
var opts = {
'dtype': 'generic'
};
var arr = array( [ [ 1, 2, 3 ], [ 4, 5, 6 ] ], opts );
var out = mapReduce( arr, 0, square, sum );
// returns 91
The mapping function is provided the following arguments:
- value: array element.
- index: element index.
- arr: input array.
The reducing function is provided the following arguments:
- accumulator: accumulated value.
- value: result of applying the mapping function to the current array element.
- index: element index.
- arr: input array.
To set the this
context when invoking the reducing function, provide a thisArg
.
function square( value ) {
return value * value;
}
function sum( accumulator, value ) {
this.count += 1;
return accumulator + value;
}
var arr = [ 1, 2, 3, 4 ];
var ctx = {
'count': 0
};
var out = mapReduce( arr, 0, square, sum, ctx );
// returns 30
var mean = out / ctx.count;
// returns 7.5
Notes
The function supports array-like objects exposing getters and setters for array element access (e.g.,
Complex64Array
,Complex128Array
, etc).var Complex64Array = require( '@stdlib/array/complex64' ); var Complex64 = require( '@stdlib/complex/float32/ctor' ); var cceil = require( '@stdlib/math/base/special/cceil' ); var realf = require( '@stdlib/complex/float32/real' ); var imagf = require( '@stdlib/complex/float32/imag' ); function sum( acc, z ) { var re1 = realf( acc ); var im1 = imagf( acc ); var re2 = realf( z ); var im2 = imagf( z ); return new Complex64( re1+re2, im1+im2 ); } var x = new Complex64Array( [ 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5 ] ); var v = mapReduce( x, new Complex64( 0.0, 0.0 ), cceil, sum ); // returns <Complex64> var re = realf( v ); // returns 20.0 var im = imagf( v ); // returns 24.0
For
ndarray
-like objects, the function performs a single-pass map-reduce operation over the entire inputndarray
(i.e., higher-orderndarray
dimensions are flattened to a single-dimension).When applying a function to
ndarray
-like objects, performance will be best forndarray
-like objects which are single-segment contiguous.
Examples
var filledarrayBy = require( '@stdlib/array/filled-by' );
var discreteUniform = require( '@stdlib/random/base/discrete-uniform' ).factory;
var naryFunction = require( '@stdlib/utils/nary-function' );
var add = require( '@stdlib/math/base/ops/add' );
var abs = require( '@stdlib/math/base/special/abs' );
var array = require( '@stdlib/ndarray/array' );
var mapReduce = require( '@stdlib/utils/map-reduce' );
function fill( i ) {
var rand = discreteUniform( -10*(i+1), 10*(i+1) );
return filledarrayBy( 10, 'generic', rand );
}
// Create a two-dimensional ndarray (i.e., a matrix):
var x = array( filledarrayBy( 10, 'generic', fill ), {
'dtype': 'generic',
'flatten': true
});
// Create an explicit unary function:
var f1 = naryFunction( abs, 1 );
// Create an explicit binary function:
var f2 = naryFunction( add, 2 );
// Compute the sum of absolute values:
var out = mapReduce( x, 0, f1, f2 );
console.log( 'x:' );
console.log( x.data );
console.log( 'sum: %d', out );