Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
<!--

@license Apache-2.0

Copyright (c) 2026 The Stdlib Authors.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

-->

# maybeRemoveSingletonDimensions

> Remove singleton dimensions from an input ndarray if and only if it contains singleton dimensions.

<!-- Section to include introductory text. Make sure to keep an empty line after the intro `section` element and another before the `/section` close. -->

<section class="intro">

</section>

<!-- /.intro -->

<!-- Package usage documentation. -->

<section class="usage">

## Usage

<!-- eslint-disable id-length -->

```javascript
var maybeRemoveSingletonDimensions = require( '@stdlib/ndarray/base/maybe-remove-singleton-dimensions' );
```

#### maybeRemoveSingletonDimensions( x, writable )

Removes singleton dimensions from an input ndarray if and only if it contains singleton dimensions.

<!-- eslint-disable id-length -->

```javascript
var array = require( '@stdlib/ndarray/array' );

// Create a 1x2x2 ndarray:
var x = array( [ [ [ 1, 2 ], [ 3, 4 ] ] ] );
// returns <ndarray>[ [ [ 1, 2 ], [ 3, 4 ] ] ]

// Remove singleton dimensions:
var y = maybeRemoveSingletonDimensions( x, false );
// returns <ndarray>[ [ 1, 2 ], [ 3, 4 ] ]
```

The function accepts the following arguments:

- **x**: input ndarray.
- **writable**: boolean indicating whether a returned ndarray should be writable.

</section>

<!-- /.usage -->

<!-- Package usage notes. Make sure to keep an empty line after the `section` element and another before the `/section` close. -->

<section class="notes">

## Notes

- The `writable` parameter **only** applies when the function returns a new ndarray instance (i.e., when the input ndarray contains singleton dimensions). When the input ndarray does not contain singleton dimensions, the function returns the input ndarray unchanged, and the `writable` parameter is ignored.
- The function **only** returns a new ndarray instance if the input ndarray contains singleton dimensions. Otherwise, the input ndarray is returned unchanged.

</section>

<!-- /.notes -->

<!-- Package usage examples. -->

<section class="examples">

## Examples

<!-- eslint-disable id-length, eslint no-undef: "error" -->

```javascript
var uniform = require( '@stdlib/random/uniform' );
var ndarray2array = require( '@stdlib/ndarray/to-array' );
var maybeRemoveSingletonDimensions = require( '@stdlib/ndarray/base/maybe-remove-singleton-dimensions' );

var x = uniform( [ 1, 1, 3, 3, 3 ], -10.0, 10.0 );
console.log( ndarray2array( x ) );

var y = maybeRemoveSingletonDimensions( x, false );
console.log( ndarray2array( y ) );
```

</section>

<!-- /.examples -->

<!-- Section to include cited references. If references are included, add a horizontal rule *before* the section. Make sure to keep an empty line after the `section` element and another before the `/section` close. -->

<section class="references">

</section>

<!-- /.references -->

<!-- Section for related `stdlib` packages. Do not manually edit this section, as it is automatically populated. -->

<section class="related">

</section>

<!-- /.related -->

<!-- Section for all links. Make sure to keep an empty line after the `section` element and another before the `/section` close. -->

<section class="links">

</section>

<!-- /.links -->
Original file line number Diff line number Diff line change
@@ -0,0 +1,197 @@
/**
* @license Apache-2.0
*
* Copyright (c) 2026 The Stdlib Authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

'use strict';

// MODULES //

var bench = require( '@stdlib/bench' );
var Float64Array = require( '@stdlib/array/float64' );
var ndarrayBase = require( '@stdlib/ndarray/base/ctor' );
var ndarray = require( '@stdlib/ndarray/ctor' );
var isndarrayLike = require( '@stdlib/assert/is-ndarray-like' );
var format = require( '@stdlib/string/format' );
var pkg = require( './../package.json' ).name;
var maybeRemoveSingletonDimensions = require( './../lib' );

Check warning on line 30 in lib/node_modules/@stdlib/ndarray/base/maybe-remove-singleton-dimensions/benchmark/benchmark.js

View workflow job for this annotation

GitHub Actions / Lint Changed Files

Identifier name 'maybeRemoveSingletonDimensions' is too long (> 25)


// MAIN //

bench( format( '%s::base_ndarray,2d', pkg ), function benchmark( b ) {
var strides;
var values;
var buffer;
var offset;
var dtype;
var shape;
var order;
var out;
var i;

dtype = 'float64';
buffer = new Float64Array( 2 );
shape = [ 1, 2 ];
strides = [ 2, 1 ];
offset = 0;
order = 'row-major';

values = [
ndarrayBase( dtype, buffer, shape, strides, offset, order ),
ndarrayBase( dtype, buffer, shape, strides, offset, order ),
ndarrayBase( dtype, buffer, shape, strides, offset, order ),
ndarrayBase( dtype, buffer, shape, strides, offset, order ),
ndarrayBase( dtype, buffer, shape, strides, offset, order )
];

b.tic();
for ( i = 0; i < b.iterations; i++ ) {
out = maybeRemoveSingletonDimensions( values[ i%values.length ], false );

Check warning on line 63 in lib/node_modules/@stdlib/ndarray/base/maybe-remove-singleton-dimensions/benchmark/benchmark.js

View workflow job for this annotation

GitHub Actions / Lint Changed Files

This line has a length of 81. Maximum allowed is 80
if ( typeof out !== 'object' ) {
b.fail( 'should return an object' );
}
}
b.toc();
if ( !isndarrayLike( out ) ) {
b.fail( 'should return an ndarray' );
}
b.pass( 'benchmark finished' );
b.end();
});

bench( format( '%s::base_ndarray,2d,no_singleton_dimensions', pkg ), function benchmark( b ) {
var strides;
var values;
var buffer;
var offset;
var dtype;
var shape;
var order;
var out;
var i;

dtype = 'float64';
buffer = new Float64Array( 4 );
shape = [ 2, 2 ];
strides = [ 2, 1 ];
offset = 0;
order = 'row-major';

values = [
ndarrayBase( dtype, buffer, shape, strides, offset, order ),
ndarrayBase( dtype, buffer, shape, strides, offset, order ),
ndarrayBase( dtype, buffer, shape, strides, offset, order ),
ndarrayBase( dtype, buffer, shape, strides, offset, order ),
ndarrayBase( dtype, buffer, shape, strides, offset, order )
];

b.tic();
for ( i = 0; i < b.iterations; i++ ) {
out = maybeRemoveSingletonDimensions( values[ i%values.length ], false );

Check warning on line 104 in lib/node_modules/@stdlib/ndarray/base/maybe-remove-singleton-dimensions/benchmark/benchmark.js

View workflow job for this annotation

GitHub Actions / Lint Changed Files

This line has a length of 81. Maximum allowed is 80
if ( typeof out !== 'object' ) {
b.fail( 'should return an object' );
}
}
b.toc();
if ( !isndarrayLike( out ) ) {
b.fail( 'should return an ndarray' );
}
b.pass( 'benchmark finished' );
b.end();
});

bench( format( '%s::ndarray,2d', pkg ), function benchmark( b ) {
var strides;
var values;
var buffer;
var offset;
var dtype;
var shape;
var order;
var out;
var i;

dtype = 'float64';
buffer = new Float64Array( 2 );
shape = [ 1, 2 ];
strides = [ 2, 1 ];
offset = 0;
order = 'row-major';

values = [
ndarray( dtype, buffer, shape, strides, offset, order ),
ndarray( dtype, buffer, shape, strides, offset, order ),
ndarray( dtype, buffer, shape, strides, offset, order ),
ndarray( dtype, buffer, shape, strides, offset, order ),
ndarray( dtype, buffer, shape, strides, offset, order )
];

b.tic();
for ( i = 0; i < b.iterations; i++ ) {
out = maybeRemoveSingletonDimensions( values[ i%values.length ], false );

Check warning on line 145 in lib/node_modules/@stdlib/ndarray/base/maybe-remove-singleton-dimensions/benchmark/benchmark.js

View workflow job for this annotation

GitHub Actions / Lint Changed Files

This line has a length of 81. Maximum allowed is 80
if ( typeof out !== 'object' ) {
b.fail( 'should return an object' );
}
}
b.toc();
if ( !isndarrayLike( out ) ) {
b.fail( 'should return an ndarray' );
}
b.pass( 'benchmark finished' );
b.end();
});

bench( format( '%s::ndarray,2d,no_singleton_dimensions', pkg ), function benchmark( b ) {
var strides;
var values;
var buffer;
var offset;
var dtype;
var shape;
var order;
var out;
var i;

dtype = 'float64';
buffer = new Float64Array( 4 );
shape = [ 2, 2 ];
strides = [ 2, 1 ];
offset = 0;
order = 'row-major';

values = [
ndarray( dtype, buffer, shape, strides, offset, order ),
ndarray( dtype, buffer, shape, strides, offset, order ),
ndarray( dtype, buffer, shape, strides, offset, order ),
ndarray( dtype, buffer, shape, strides, offset, order ),
ndarray( dtype, buffer, shape, strides, offset, order )
];

b.tic();
for ( i = 0; i < b.iterations; i++ ) {
out = maybeRemoveSingletonDimensions( values[ i%values.length ], false );

Check warning on line 186 in lib/node_modules/@stdlib/ndarray/base/maybe-remove-singleton-dimensions/benchmark/benchmark.js

View workflow job for this annotation

GitHub Actions / Lint Changed Files

This line has a length of 81. Maximum allowed is 80
if ( typeof out !== 'object' ) {
b.fail( 'should return an object' );
}
}
b.toc();
if ( !isndarrayLike( out ) ) {
b.fail( 'should return an ndarray' );
}
b.pass( 'benchmark finished' );
b.end();
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@

{{alias}}( x, writable )
Removes singleton dimensions from an input ndarray if and only if it
contains singleton dimensions.

Parameters
----------
x: ndarray
Input array.

writable: boolean
Boolean indicating whether a returned array should be writable.

Returns
-------
out: ndarray
Squeezed ndarray view or input ndarray.

Examples
--------
> var x = {{alias:@stdlib/ndarray/array}}( [ [ 1, 2 ], [ 3, 4 ] ], { 'ndmin': 5 } )
<ndarray>[ [ [ [ [ 1, 2 ], [ 3, 4 ] ] ] ] ]
> var y = {{alias}}( x, false )
<ndarray>[ [ 1, 2 ], [ 3, 4 ] ]

See Also
--------
Loading