@@ -23,16 +23,16 @@ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">ndarra
2323 < div class ='clearfix '>
2424
2525 < div class ='fl pad1y space-right2 '>
26- < span class ="strong "> 97.48 % </ span >
26+ < span class ="strong "> 96.17 % </ span >
2727 < span class ="quiet "> Statements</ span >
28- < span class ='fraction '> 155/159 </ span >
28+ < span class ='fraction '> 151/157 </ span >
2929 </ div >
3030
3131
3232 < div class ='fl pad1y space-right2 '>
33- < span class ="strong "> 92.3 % </ span >
33+ < span class ="strong "> 85.71 % </ span >
3434 < span class ="quiet "> Branches</ span >
35- < span class ='fraction '> 24/26 </ span >
35+ < span class ='fraction '> 18/21 </ span >
3636 </ div >
3737
3838
@@ -44,9 +44,9 @@ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">ndarra
4444
4545
4646 < div class ='fl pad1y space-right2 '>
47- < span class ="strong "> 97.48 % </ span >
47+ < span class ="strong "> 96.17 % </ span >
4848 < span class ="quiet "> Lines</ span >
49- < span class ='fraction '> 155/159 </ span >
49+ < span class ='fraction '> 151/157 </ span >
5050 </ div >
5151
5252
@@ -220,9 +220,7 @@ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">ndarra
220220< a name ='L155 '> </ a > < a href ='#L155 '> 155</ a >
221221< a name ='L156 '> </ a > < a href ='#L156 '> 156</ a >
222222< a name ='L157 '> </ a > < a href ='#L157 '> 157</ a >
223- < a name ='L158 '> </ a > < a href ='#L158 '> 158</ a >
224- < a name ='L159 '> </ a > < a href ='#L159 '> 159</ a >
225- < a name ='L160 '> </ a > < a href ='#L160 '> 160</ a > </ td > < td class ="line-coverage quiet "> < span class ="cline-any cline-yes "> 1x</ span >
223+ < a name ='L158 '> </ a > < a href ='#L158 '> 158</ a > </ td > < td class ="line-coverage quiet "> < span class ="cline-any cline-yes "> 1x</ span >
226224< span class ="cline-any cline-yes "> 1x</ span >
227225< span class ="cline-any cline-yes "> 1x</ span >
228226< span class ="cline-any cline-yes "> 1x</ span >
@@ -304,78 +302,76 @@ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">ndarra
304302< span class ="cline-any cline-yes "> 1x</ span >
305303< span class ="cline-any cline-yes "> 1x</ span >
306304< span class ="cline-any cline-yes "> 1x</ span >
307- < span class ="cline-any cline-yes "> 52x</ span >
308- < span class ="cline-any cline-yes "> 52x</ span >
309- < span class ="cline-any cline-yes "> 52x</ span >
310- < span class ="cline-any cline-yes "> 52x</ span >
311- < span class ="cline-any cline-yes "> 52x</ span >
312- < span class ="cline-any cline-yes "> 52x</ span >
313- < span class ="cline-any cline-yes "> 52x</ span >
314- < span class ="cline-any cline-yes "> 52x</ span >
315- < span class ="cline-any cline-yes "> 52x</ span >
316- < span class ="cline-any cline-yes "> 52x</ span >
317- < span class ="cline-any cline-yes "> 52x</ span >
318- < span class ="cline-any cline-yes "> 52x</ span >
319- < span class ="cline-any cline-yes "> 52x</ span >
320- < span class ="cline-any cline-yes "> 52x</ span >
321- < span class ="cline-any cline-yes "> 52x</ span >
322- < span class ="cline-any cline-yes "> 52x</ span >
323- < span class ="cline-any cline-yes "> 52x</ span >
324- < span class ="cline-any cline-yes "> 20x</ span >
325- < span class ="cline-any cline-yes "> 20x</ span >
326- < span class ="cline-any cline-yes "> 32x</ span >
327- < span class ="cline-any cline-yes "> 32x</ span >
328- < span class ="cline-any cline-yes "> 52x</ span >
329- < span class ="cline-any cline-yes "> 96x</ span >
330- < span class ="cline-any cline-yes "> 96x</ span >
331- < span class ="cline-any cline-yes "> 32x</ span >
332- < span class ="cline-any cline-yes "> 32x</ span >
333- < span class ="cline-any cline-yes "> 32x</ span >
334- < span class ="cline-any cline-yes "> 52x</ span >
335- < span class ="cline-any cline-yes "> 13x</ span >
336- < span class ="cline-any cline-yes "> 13x</ span >
337- < span class ="cline-any cline-yes "> 32x</ span >
338- < span class ="cline-any cline-yes "> 32x</ span >
339- < span class ="cline-any cline-yes "> 32x</ span >
340- < span class ="cline-any cline-yes "> 52x</ span >
305+ < span class ="cline-any cline-yes "> 1x</ span >
306+ < span class ="cline-any cline-yes "> 29x</ span >
307+ < span class ="cline-any cline-yes "> 29x</ span >
308+ < span class ="cline-any cline-yes "> 29x</ span >
309+ < span class ="cline-any cline-yes "> 29x</ span >
310+ < span class ="cline-any cline-yes "> 29x</ span >
311+ < span class ="cline-any cline-yes "> 29x</ span >
312+ < span class ="cline-any cline-yes "> 29x</ span >
313+ < span class ="cline-any cline-yes "> 29x</ span >
314+ < span class ="cline-any cline-yes "> 29x</ span >
315+ < span class ="cline-any cline-yes "> 29x</ span >
316+ < span class ="cline-any cline-yes "> 29x</ span >
317+ < span class ="cline-any cline-yes "> 29x</ span >
318+ < span class ="cline-any cline-yes "> 29x</ span >
319+ < span class ="cline-any cline-yes "> 29x</ span >
320+ < span class ="cline-any cline-yes "> 29x</ span >
321+ < span class ="cline-any cline-yes "> 29x</ span >
322+ < span class ="cline-any cline-yes "> 29x</ span >
323+ < span class ="cline-any cline-yes "> 29x</ span >
324+ < span class ="cline-any cline-yes "> 29x</ span >
325+ < span class ="cline-any cline-yes "> 10x</ span >
326+ < span class ="cline-any cline-yes "> 10x</ span >
327+ < span class ="cline-any cline-yes "> 19x</ span >
328+ < span class ="cline-any cline-yes "> 19x</ span >
329+ < span class ="cline-any cline-yes "> 19x</ span >
330+ < span class ="cline-any cline-yes "> 19x</ span >
331+ < span class ="cline-any cline-yes "> 19x</ span >
332+ < span class ="cline-any cline-yes "> 19x</ span >
333+ < span class ="cline-any cline-yes "> 29x</ span >
341334< span class ="cline-any cline-no "> </ span >
342335< span class ="cline-any cline-no "> </ span >
343- < span class ="cline-any cline-yes "> 32x </ span >
344- < span class ="cline-any cline-yes "> 52x </ span >
336+ < span class ="cline-any cline-yes "> 19x </ span >
337+ < span class ="cline-any cline-yes "> 29x </ span >
345338< span class ="cline-any cline-no "> </ span >
346339< span class ="cline-any cline-no "> </ span >
347- < span class ="cline-any cline-yes "> 32x</ span >
348- < span class ="cline-any cline-yes "> 52x</ span >
349- < span class ="cline-any cline-yes "> 82x</ span >
350- < span class ="cline-any cline-yes "> 82x</ span >
351- < span class ="cline-any cline-yes "> 24x</ span >
352- < span class ="cline-any cline-yes "> 22x</ span >
353- < span class ="cline-any cline-yes "> 22x</ span >
354- < span class ="cline-any cline-yes "> 22x</ span >
355- < span class ="cline-any cline-yes "> 24x</ span >
340+ < span class ="cline-any cline-yes "> 19x</ span >
341+ < span class ="cline-any cline-yes "> 19x</ span >
342+ < span class ="cline-any cline-yes "> 19x</ span >
343+ < span class ="cline-any cline-yes "> 19x</ span >
344+ < span class ="cline-any cline-yes "> 29x</ span >
345+ < span class ="cline-any cline-yes "> 45x</ span >
346+ < span class ="cline-any cline-yes "> 45x</ span >
347+ < span class ="cline-any cline-yes "> 11x</ span >
348+ < span class ="cline-any cline-yes "> 10x</ span >
349+ < span class ="cline-any cline-yes "> 10x</ span >
350+ < span class ="cline-any cline-yes "> 10x</ span >
351+ < span class ="cline-any cline-yes "> 11x</ span >
352+ < span class ="cline-any cline-yes "> 11x</ span >
353+ < span class ="cline-any cline-yes "> 11x</ span >
354+ < span class ="cline-any cline-yes "> 45x</ span >
355+ < span class ="cline-any cline-yes "> 10x</ span >
356+ < span class ="cline-any cline-yes "> 10x</ span >
357+ < span class ="cline-any cline-yes "> 10x</ span >
356358< span class ="cline-any cline-yes "> 24x</ span >
357359< span class ="cline-any cline-yes "> 24x</ span >
358- < span class ="cline-any cline-yes "> 82x</ span >
359- < span class ="cline-any cline-yes "> 20x</ span >
360- < span class ="cline-any cline-yes "> 20x</ span >
361- < span class ="cline-any cline-yes "> 20x</ span >
362- < span class ="cline-any cline-yes "> 38x</ span >
363- < span class ="cline-any cline-yes "> 38x</ span >
364- < span class ="cline-any cline-yes "> 82x</ span >
360+ < span class ="cline-any cline-yes "> 45x</ span >
365361< span class ="cline-any cline-yes "> 6x</ span >
366362< span class ="cline-any cline-yes "> 6x</ span >
367- < span class ="cline-any cline-yes "> 82x</ span >
368- < span class ="cline-any cline-yes "> 26x</ span >
369- < span class ="cline-any cline-yes "> 82x</ span >
363+ < span class ="cline-any cline-yes "> 45x</ span >
364+ < span class ="cline-any cline-yes "> 16x</ span >
365+ < span class ="cline-any cline-yes "> 45x</ span >
366+ < span class ="cline-any cline-no "> </ span >
367+ < span class ="cline-any cline-no "> </ span >
370368< span class ="cline-any cline-yes "> 2x</ span >
371369< span class ="cline-any cline-yes "> 2x</ span >
372- < span class ="cline-any cline-yes "> 6x</ span >
373- < span class ="cline-any cline-yes "> 4x</ span >
374- < span class ="cline-any cline-yes "> 4x</ span >
375- < span class ="cline-any cline-yes "> 4x</ span >
376- < span class ="cline-any cline-yes "> 82x</ span >
377- < span class ="cline-any cline-yes "> 22x</ span >
378- < span class ="cline-any cline-yes "> 52x</ span >
370+ < span class ="cline-any cline-yes "> 2x</ span >
371+ < span class ="cline-any cline-yes "> 2x</ span >
372+ < span class ="cline-any cline-yes "> 45x</ span >
373+ < span class ="cline-any cline-yes "> 11x</ span >
374+ < span class ="cline-any cline-yes "> 29x</ span >
379375< span class ="cline-any cline-yes "> 1x</ span >
380376< span class ="cline-any cline-yes "> 1x</ span >
381377< span class ="cline-any cline-yes "> 1x</ span >
@@ -403,7 +399,7 @@ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">ndarra
403399
404400// MODULES //
405401
406- var copy = require( '@stdlib/array/base/copy-indexed ' );
402+ var copy = require( '@stdlib/array/base/copy' );
407403var ndarray = require( '@stdlib/ndarray/base/ctor' );
408404var getShape = require( '@stdlib/ndarray/base/shape' );
409405var getStrides = require( '@stdlib/ndarray/base/strides' );
@@ -412,18 +408,19 @@ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">ndarra
412408var getDType = require( '@stdlib/ndarray/base/dtype' );
413409var getData = require( '@stdlib/ndarray/base/data-buffer' );
414410var normalizeIndices = require( '@stdlib/ndarray/base/normalize-indices' );
415- var format = require( '@stdlib/string/format' );
416411var join = require( '@stdlib/array/base/join' );
412+ var zeros = require( '@stdlib/array/base/zeros' );
413+ var format = require( '@stdlib/string/format' );
417414
418415
419416// MAIN //
420417
421418/**
422- * Broadcasts an input ndarray to a target shape keeping the specified dimensions unchanged.
419+ * Broadcasts an input ndarray to a target shape while keeping a list of specified dimensions unchanged.
423420*
424421* @param {ndarray} arr - input array
425422* @param {NonNegativeIntegerArray} shape - desired shape
426- * @param {IntegerArray} [ dims] - list of dimensions to exclude
423+ * @param {IntegerArray} dims - list of dimensions to exclude from broadcasting
427424* @throws {Error} input array cannot have more dimensions than the desired shape
428425* @throws {Error} input array and desired shape must be broadcast compatible
429426* @throws {RangeError} dimension indices must not exceed desired shape bounds
@@ -463,7 +460,7 @@ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">ndarra
463460* v = y.get( 1, 0, 2 );
464461* // returns 3
465462*/
466- function broadcastArrayExceptDimensions( arr, shape, dims ) {
463+ function broadcastArrayExceptDimensions( arr, shape, dims ) { // eslint-disable-line id-length
467464 var strides;
468465 var dim;
469466 var sh;
@@ -476,26 +473,20 @@ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">ndarra
476473 var i;
477474 var j;
478475
476+ shape = copy( shape ); // perform a copy to avoid unintended mutation
479477 N = shape.length;
478+
480479 sh = getShape( arr, false );
481480 M = sh.length;
482481 if ( N < M ) {
483482 throw new Error( 'invalid argument. Cannot broadcast an array to a shape having fewer dimensions. Arrays can only be broadcasted to shapes having the same or more dimensions.' );
484483 }
485- // Initialize a strides array...
486- strides = [];
487- for ( i = 0; i < N; i++ ) {
488- strides.push( 0 );
489- }
490- // Determine the output array strides...
491- st = getStrides( arr, false );
484+ // Initialize a strides array:
485+ strides = zeros( N );
492486
493- if ( !dims ) {
494- dims = [ -1 ];
495- }
496487 // Verify that we've been provided a list of unique dimension indices...
497488 dl = dims.length;
498- dims = normalizeIndices( dims, N - 1 );
489+ dims = normalizeIndices( dims, N- 1 );
499490 if ( dims === null ) < span class ="branch-0 cbranch-no " title ="branch not covered " > {</ span >
500491< span class ="cstat-no " title ="statement not covered " > throw new RangeError( format( 'invalid argument. Third argument contains an out-of-bounds dimension index. Value: [%s].', join( dims, ',' ) ) );</ span >
501492< span class ="cstat-no " title ="statement not covered " > }</ span >
@@ -504,6 +495,9 @@ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">ndarra
504495< span class ="cstat-no " title ="statement not covered " > throw new Error( format( 'invalid argument. Third argument must contain a list of unique dimension indices. Value: [%s].', join( dims, ',' ) ) );</ span >
505496< span class ="cstat-no " title ="statement not covered " > }</ span >
506497 di = dims.length - 1;
498+
499+ // Determine the output array strides...
500+ st = getStrides( arr, false );
507501 for ( i = N-1; i >= 0; i-- ) {
508502 j = M - N + i;
509503 if ( di >= 0 && dims[ di ] === i ) {
@@ -525,15 +519,15 @@ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">ndarra
525519 }
526520 if ( d === dim ) {
527521 strides[ i ] = st[ j ];
528- } else if ( d === 1 ) {
529- // In order to broadcast dimensions, we set the stride for that dimension to zero...
530- strides[ i ] = 0;
522+ } else if ( d === 1 ) < span class =" branch-0 cbranch-no " title =" branch not covered " > { </ span >
523+ < span class =" cstat-no " title =" statement not covered " > // In order to broadcast dimensions, we set the stride for that dimension to zero...</ span >
524+ < span class =" cstat-no " title =" statement not covered " > strides[ i ] = 0;</ span >
531525 } else {
532526 // At this point, we know that `dim > d` and that `d` does not equal `1` (e.g., `dim=3` and `d=2`); in which case, the shapes are considered incompatible (even for desired shapes which are multiples of array dimensions, as might be desired when "tiling" an array; e.g., `dim=4` and `d=2`)...
533527 throw new Error( format( 'invalid argument. Input array and the specified shape are broadcast incompatible. Array shape: (%s). Desired shape: (%s). Dimension: %u.', copy( sh ).join( ', ' ), copy( shape ).join( ', ' ), i ) );
534528 }
535529 }
536- return ndarray( getDType( arr ), getData( arr ), copy( shape ) , strides, getOffset( arr ), getOrder( arr ) ); // eslint-disable-line max-len
530+ return ndarray( getDType( arr ), getData( arr ), shape, strides, getOffset( arr ), getOrder( arr ) ); // eslint-disable-line max-len
537531}
538532
539533
@@ -547,7 +541,7 @@ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">ndarra
547541 < div class ='footer quiet pad2 space-top1 center small '>
548542 Code coverage generated by
549543 < a href ="https://istanbul.js.org/ " target ="_blank " rel ="noopener noreferrer "> istanbul</ a >
550- at 2025-08-12T20:05:31.348Z
544+ at 2025-09-02T05:19:33.610Z
551545 </ div >
552546 < script src ="../../../../prettify.js "> </ script >
553547 < script >
0 commit comments