Take elements from one of two strided arrays depending on a condition.
var gwhere = require( '@stdlib/blas/ext/base/gwhere' );Takes elements from one of two strided arrays depending on a condition.
var condition = [ 1, 0, 1 ];
var x = [ 1.0, 2.0, 3.0 ];
var y = [ 4.0, 5.0, 6.0 ];
var out = gwhere( 3, condition, 1, x, 1, y, 1 );
// returns [ 1.0, 5.0, 3.0 ]The function has the following parameters:
- N: number of indexed elements.
- condition: condition array.
- strideC: stride length for
condition. - x: first input
Arrayortyped array. - strideX: stride length for
x. - y: second input
Arrayortyped array. - strideY: stride length for
y.
The N and stride parameters determine which elements in the strided arrays are accessed at runtime. For example, to select from every other element:
var condition = [ 1, 0, 0, 1, 1, 0 ];
var x = [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 ];
var y = [ 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ];
var out = gwhere( 3, condition, 2, x, 2, y, 2 );
// returns [ 1.0, 9.0, 5.0 ]Note that indexing is relative to the first index. To introduce an offset, use typed array views.
var Float64Array = require( '@stdlib/array/float64' );
// Initial arrays...
var condition0 = new Float64Array( [ 0.0, 1.0, 0.0, 1.0, 0.0, 1.0 ] );
var x0 = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 ] );
var y0 = new Float64Array( [ 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
// Create offset views...
var condition1 = new Float64Array( condition0.buffer, condition0.BYTES_PER_ELEMENT*1 ); // start at 2nd element
var x1 = new Float64Array( x0.buffer, x0.BYTES_PER_ELEMENT*1 ); // start at 2nd element
var y1 = new Float64Array( y0.buffer, y0.BYTES_PER_ELEMENT*1 ); // start at 2nd element
var out = gwhere( 3, condition1, 2, x1, 2, y1, 2 );
// returns [ 2.0, 4.0, 6.0 ]Takes elements from one of two strided arrays depending on a condition using alternative indexing semantics.
var condition = [ 1, 0, 1 ];
var x = [ 1.0, 2.0, 3.0 ];
var y = [ 4.0, 5.0, 6.0 ];
var out = gwhere.ndarray( 3, condition, 1, 0, x, 1, 0, y, 1, 0 );
// returns [ 1.0, 5.0, 3.0 ]The function has the following additional parameters:
- offsetC: starting index for
condition. - offsetX: starting index for
x. - offsetY: starting index for
y.
While typed array views mandate a view offset based on the underlying buffer, offset parameters support indexing semantics based on starting indices. For example, to select from every other element starting from the second element:
var condition = [ 0, 1, 0, 0, 0, 1 ];
var x = [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 ];
var y = [ 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ];
var out = gwhere.ndarray( 3, condition, 2, 1, x, 2, 1, y, 2, 1 );
// returns [ 2.0, 10.0, 6.0 ]- If
N <= 0, both functions return an empty array. - Both functions support array-like objects having getter and setter accessors for array element access (e.g.,
@stdlib/array/base/accessor). - Depending on the environment, the typed versions (
dwhere,swhere, etc.) are likely to be significantly more performant.
var bernoulli = require( '@stdlib/random/array/bernoulli' );
var discreteUniform = require( '@stdlib/random/array/discrete-uniform' );
var gwhere = require( '@stdlib/blas/ext/base/gwhere' );
var condition = bernoulli( 20, 0.5, {
'dtype': 'generic'
});
console.log( condition );
var x = discreteUniform( 20, 0, 100, {
'dtype': 'generic'
});
console.log( x );
var y = discreteUniform( 20, -100, 0, {
'dtype': 'generic'
});
console.log( y );
var out = gwhere( condition.length, condition, 1, x, 1, y, 1 );
console.log( out );