function reduce2d( arr, initial, reducer, thisArg ) {
	var out;
	var acc;
	var M;
	var N;
	var a;
	var i;
	var j;

	if ( !isArrayLikeObject( arr ) ) {
		throw new TypeError( format( 'invalid argument. First argument must be an array-like object. Value: `%s`.', arr ) );
	}
	if ( !isArrayLikeObject( initial ) ) {
		throw new TypeError( format( 'invalid argument. Second argument must be an array-like object. Value: `%s`.', initial ) );
	}
	if ( initial.length !== arr.length ) {
		throw new RangeError( 'invalid argument. Second argument must have a length equal to the size of the outermost input array dimension.' );
	}
	if ( !isFunction( reducer ) ) {
		throw new TypeError( format( 'invalid argument. Third argument must be a function. Value: `%s`.', reducer ) );
	}
	M = arr.length;
	out = [];
	for ( i = 0; i < M; i++ ) {
		a = arr[ i ];
		if ( !isCollection( a ) ) {
			throw new TypeError( format( 'invalid argument. First argument must be an array-like object containing array-like objects. Index: `%u`. Value: `%s`.', i, a ) );
		}
		N = a.length;
		acc = initial[ i ];
		for ( j = 0; j < N; j++ ) {
			acc = reducer.call( thisArg, acc, a[ j ], [ i, j ], arr );
		}
		out.push( acc );
	}
	return out;
}
Reduces the number of dimensions by one of a two-dimensional nested array by applying a function against an accumulator and each element along the innermost dimension and returning the accumulation results as a one-dimensional array.

## Notes

-   The applied function is provided the following arguments:

    -   **accumulator**: accumulated value.
    -   **value**: array element.
    -   **indices**: current array element indices.
    -   **arr**: input array.

@param {ArrayLikeObject<Collection>} arr - array of arrays
@param {ArrayLikeObject} initial - initial values
@param {Function} reducer - reduction function
@param {*} [thisArg] - function execution context
@throws {TypeError} first argument must be an array of arrays
@throws {TypeError} second argument must be an array-like object
@throws {RangeError} second argument must have a length equal to the size of the outermost input array dimension
@throws {TypeError} third argument must be a function
@returns {Array} results

@example
var naryFunction = require( '@stdlib/utils/nary-function' );
var add = require( '@stdlib/number/float64/base/add' );

var arr = [
    [ 1, 2, 3 ],
    [ 4, 5, 6 ]
];

var out = reduce2d( arr, [ 0, 0 ], naryFunction( add, 2 ) );
// returns [ 6, 15 ]