Skip to content

Commit f3c9786

Browse files
committed
Auto-generated commit
1 parent 2960b90 commit f3c9786

File tree

18 files changed

+713
-146
lines changed

18 files changed

+713
-146
lines changed

.github/.keepalive

Lines changed: 0 additions & 1 deletion
This file was deleted.

CHANGELOG.md

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,37 @@
44
55
<section class="release" id="unreleased">
66

7-
## Unreleased (2025-06-23)
7+
## Unreleased (2025-07-09)
8+
9+
<section class="features">
10+
11+
### Features
12+
13+
- [`a0f761b`](https://github.com/stdlib-js/stdlib/commit/a0f761b72ab538e2a92f97a3ca6de7e53ed45004) - add support for accessor arrays and refactor `stats/base/nanstdevtk` [(#7589)](https://github.com/stdlib-js/stdlib/pull/7589)
14+
15+
</section>
16+
17+
<!-- /.features -->
18+
19+
<section class="issues">
20+
21+
### Closed Issues
22+
23+
This release closes the following issue:
24+
25+
[#5670](https://github.com/stdlib-js/stdlib/issues/5670)
26+
27+
</section>
28+
29+
<!-- /.issues -->
830

931
<section class="commits">
1032

1133
### Commits
1234

1335
<details>
1436

37+
- [`a0f761b`](https://github.com/stdlib-js/stdlib/commit/a0f761b72ab538e2a92f97a3ca6de7e53ed45004) - **feat:** add support for accessor arrays and refactor `stats/base/nanstdevtk` [(#7589)](https://github.com/stdlib-js/stdlib/pull/7589) _(by Gururaj Gurram)_
1538
- [`cfd273d`](https://github.com/stdlib-js/stdlib/commit/cfd273df8e26730ad7a331e87430272cbf91c10a) - **refactor:** update paths _(by Aayush Khanna)_
1639

1740
</details>
@@ -24,9 +47,10 @@
2447

2548
### Contributors
2649

27-
A total of 1 person contributed to this release. Thank you to this contributor:
50+
A total of 2 people contributed to this release. Thank you to the following contributors:
2851

2952
- Aayush Khanna
53+
- Gururaj Gurram
3054

3155
</section>
3256

CONTRIBUTORS

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ Annamalai Prabu <apfossdev@gmail.com>
2727
Anshu Kumar <132515490+anxhukumar@users.noreply.github.com>
2828
Anshu Kumar <contact.anshukumar@protonmail.com>
2929
Anudeep Sanapala <anudeep0306@gmail.com>
30+
Arihant Pal <arihant0pal@gmail.com>
3031
Aryan Bhirud <112156883+AryanBhirud@users.noreply.github.com>
3132
Athan Reines <kgryte@gmail.com>
3233
Ayaka <73595362+USERSATOSHI@users.noreply.github.com>
@@ -37,6 +38,7 @@ Bryan Elee <rxbryn@gmail.com>
3738
Chinmay Joshi <86140365+JawHawk@users.noreply.github.com>
3839
Christopher Dambamuromo <chridam@gmail.com>
3940
Dan Rose <danoftheroses@gmail.com>
41+
Daniel Hernandez Gomez <156333015+dhernandeez13@users.noreply.github.com>
4042
Daniel Killenberger <daniel.killenberger@gmail.com>
4143
Daniel Yu <40680511+Daniel777y@users.noreply.github.com>
4244
Debashis Maharana <debashismaharana7854@gmail.com>
@@ -63,6 +65,7 @@ Girish Garg <garggirish2020@gmail.com>
6365
Golden Kumar <103646877+AuenKr@users.noreply.github.com>
6466
Gunj Joshi <gunjjoshi8372@gmail.com>
6567
Gururaj Gurram <gururajgurram1512@gmail.com>
68+
Harishchandra Reddy <harish.7000@gmail.com>
6669
Haroon Rasheed <51189276+haroon26@users.noreply.github.com>
6770
Harsh <harshyadav6078@gmail.com>
6871
HarshaNP <96897754+GittyHarsha@users.noreply.github.com>
@@ -196,11 +199,13 @@ Yaswanth Kosuru <116426380+yaswanthkosuru@users.noreply.github.com>
196199
Yernar Yergaziyev <yernar.yergaziyev@erg.kz>
197200
Yugal Kaushik <yugalkaushik14@gmail.com>
198201
Yuvi Mittal <128018763+yuvi-mittal@users.noreply.github.com>
202+
deepak427 <62477872+deepak427@users.noreply.github.com>
199203
devshree-bhati <147095250+devshree-bhati@users.noreply.github.com>
200204
ditsu <170345142+ditsus@users.noreply.github.com>
201205
ekambains <bainsinbusiness@gmail.com>
202206
fadiothman22 <48636283+fadiothman22@users.noreply.github.com>
203207
iraandrushko <71790513+iraandrushko@users.noreply.github.com>
208+
jsai28 <54253219+jsai28@users.noreply.github.com>
204209
lohithganni <116790357+lohithganni@users.noreply.github.com>
205210
olenkabilonizhka <62379231+olenkabilonizhka@users.noreply.github.com>
206211
pranav-1720 <123018993+pranav-1720@users.noreply.github.com>

README.md

Lines changed: 25 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,9 @@ To view installation and usage instructions specific to each branch build, be su
131131
var nanstdevtk = require( '@stdlib/stats-base-nanstdevtk' );
132132
```
133133

134-
#### nanstdevtk( N, correction, x, stride )
134+
#### nanstdevtk( N, correction, x, strideX )
135135

136-
Computes the [standard deviation][standard-deviation] of a strided array `x` ignoring `NaN` values and using a one-pass textbook algorithm.
136+
Computes the [standard deviation][standard-deviation] of a strided array ignoring `NaN` values and using a one-pass textbook algorithm.
137137

138138
```javascript
139139
var x = [ 1.0, -2.0, NaN, 2.0 ];
@@ -147,38 +147,32 @@ The function has the following parameters:
147147
- **N**: number of indexed elements.
148148
- **correction**: degrees of freedom adjustment. Setting this parameter to a value other than `0` has the effect of adjusting the divisor during the calculation of the [standard deviation][standard-deviation] according to `N-c` where `c` corresponds to the provided degrees of freedom adjustment. When computing the [standard deviation][standard-deviation] of a population, setting this parameter to `0` is the standard choice (i.e., the provided array contains data constituting an entire population). When computing the corrected sample [standard deviation][standard-deviation], setting this parameter to `1` is the standard choice (i.e., the provided array contains data sampled from a larger population; this is commonly referred to as Bessel's correction).
149149
- **x**: input [`Array`][mdn-array] or [`typed array`][mdn-typed-array].
150-
- **stride**: index increment for `x`.
150+
- **strideX**: stride length for `x`.
151151

152152
The `N` and `stride` parameters determine which elements in `x` are accessed at runtime. For example, to compute the [standard deviation][standard-deviation] of every other element in `x`,
153153

154154
```javascript
155-
var floor = require( '@stdlib/math-base-special-floor' );
156-
157155
var x = [ 1.0, 2.0, 2.0, -7.0, -2.0, 3.0, 4.0, 2.0, NaN ];
158-
var N = floor( x.length / 2 );
159156

160-
var v = nanstdevtk( N, 1, x, 2 );
157+
var v = nanstdevtk( 5, 1, x, 2 );
161158
// returns 2.5
162159
```
163160

164161
Note that indexing is relative to the first index. To introduce an offset, use [`typed array`][mdn-typed-array] views.
165162

166-
<!-- eslint-disable stdlib/capitalized-comments -->
163+
<!-- eslint-disable stdlib/capitalized-comments, max-len -->
167164

168165
```javascript
169166
var Float64Array = require( '@stdlib/array-float64' );
170-
var floor = require( '@stdlib/math-base-special-floor' );
171167

172-
var x0 = new Float64Array( [ 2.0, 1.0, 2.0, -2.0, -2.0, 2.0, 3.0, 4.0, NaN ] );
168+
var x0 = new Float64Array( [ 2.0, 1.0, 2.0, -2.0, -2.0, 2.0, 3.0, 4.0, NaN, NaN ] );
173169
var x1 = new Float64Array( x0.buffer, x0.BYTES_PER_ELEMENT*1 ); // start at 2nd element
174170

175-
var N = floor( x0.length / 2 );
176-
177-
var v = nanstdevtk( N, 1, x1, 2 );
171+
var v = nanstdevtk( 5, 1, x1, 2 );
178172
// returns 2.5
179173
```
180174

181-
#### nanstdevtk.ndarray( N, correction, x, stride, offset )
175+
#### nanstdevtk.ndarray( N, correction, x, strideX, offsetX )
182176

183177
Computes the [standard deviation][standard-deviation] of a strided array ignoring `NaN` values and using a one-pass textbook algorithm and alternative indexing semantics.
184178

@@ -191,17 +185,14 @@ var v = nanstdevtk.ndarray( x.length, 1, x, 1, 0 );
191185

192186
The function has the following additional parameters:
193187

194-
- **offset**: starting index for `x`.
188+
- **offsetX**: starting index for `x`.
195189

196-
While [`typed array`][mdn-typed-array] views mandate a view offset based on the underlying `buffer`, the `offset` parameter supports indexing semantics based on a starting index. For example, to calculate the [standard deviation][standard-deviation] for every other value in `x` starting from the second value
190+
While [`typed array`][mdn-typed-array] views mandate a view offset based on the underlying buffer, the offset parameter supports indexing semantics based on a starting index. For example, to calculate the [standard deviation][standard-deviation] for every other element in `x` starting from the second element
197191

198192
```javascript
199-
var floor = require( '@stdlib/math-base-special-floor' );
193+
var x = [ 2.0, 1.0, 2.0, -2.0, -2.0, 2.0, 3.0, 4.0, NaN, NaN ];
200194

201-
var x = [ 2.0, 1.0, 2.0, -2.0, -2.0, 2.0, 3.0, 4.0 ];
202-
var N = floor( x.length / 2 );
203-
204-
var v = nanstdevtk.ndarray( N, 1, x, 2, 1 );
195+
var v = nanstdevtk.ndarray( 5, 1, x, 2, 1 );
205196
// returns 2.5
206197
```
207198

@@ -216,6 +207,7 @@ var v = nanstdevtk.ndarray( N, 1, x, 2, 1 );
216207
- If `N <= 0`, both functions return `NaN`.
217208
- If `n - c` is less than or equal to `0` (where `c` corresponds to the provided degrees of freedom adjustment and `n` corresponds to the number of non-`NaN` indexed elements), both functions return `NaN`.
218209
- Some caution should be exercised when using the one-pass textbook algorithm. Literature overwhelmingly discourages the algorithm's use for two reasons: 1) the lack of safeguards against underflow and overflow and 2) the risk of catastrophic cancellation when subtracting the two sums if the sums are large and the variance small. These concerns have merit; however, the one-pass textbook algorithm should not be dismissed outright. For data distributions with a moderately large standard deviation to mean ratio (i.e., **coefficient of variation**), the one-pass textbook algorithm may be acceptable, especially when performance is paramount and some precision loss is acceptable (including a risk of computing a negative variance due to floating-point rounding errors!). In short, no single "best" algorithm for computing the standard deviation exists. The "best" algorithm depends on the underlying data distribution, your performance requirements, and your minimum precision requirements. When evaluating which algorithm to use, consider the relative pros and cons, and choose the algorithm which best serves your needs.
210+
- Both functions support array-like objects having getter and setter accessors for array element access (e.g., [`@stdlib/array-base/accessor`][@stdlib/array/base/accessor]).
219211
- Depending on the environment, the typed versions ([`dnanstdevtk`][@stdlib/stats/strided/dnanstdevtk], [`snanstdevtk`][@stdlib/stats/base/snanstdevtk], etc.) are likely to be significantly more performant.
220212

221213
</section>
@@ -229,18 +221,19 @@ var v = nanstdevtk.ndarray( N, 1, x, 2, 1 );
229221
<!-- eslint no-undef: "error" -->
230222

231223
```javascript
232-
var randu = require( '@stdlib/random-base-randu' );
233-
var round = require( '@stdlib/math-base-special-round' );
234-
var Float64Array = require( '@stdlib/array-float64' );
224+
var uniform = require( '@stdlib/random-base-uniform' );
225+
var filledarrayBy = require( '@stdlib/array-filled-by' );
226+
var bernoulli = require( '@stdlib/random-base-bernoulli' );
235227
var nanstdevtk = require( '@stdlib/stats-base-nanstdevtk' );
236228

237-
var x;
238-
var i;
239-
240-
x = new Float64Array( 10 );
241-
for ( i = 0; i < x.length; i++ ) {
242-
x[ i ] = round( (randu()*100.0) - 50.0 );
229+
function rand() {
230+
if ( bernoulli( 0.8 ) < 1 ) {
231+
return NaN;
232+
}
233+
return uniform( -50.0, 50.0 );
243234
}
235+
236+
var x = filledarrayBy( 10, 'float64', rand );
244237
console.log( x );
245238

246239
var v = nanstdevtk( x.length, 1, x, 1 );
@@ -359,6 +352,8 @@ Copyright &copy; 2016-2025. The Stdlib [Authors][stdlib-authors].
359352

360353
[mdn-typed-array]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray
361354

355+
[@stdlib/array/base/accessor]: https://github.com/stdlib-js/array-base-accessor
356+
362357
[@ling:1974a]: https://doi.org/10.2307/2286154
363358

364359
<!-- <related-links> -->

benchmark/benchmark.js

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,30 @@
2121
// MODULES //
2222

2323
var bench = require( '@stdlib/bench-harness' );
24-
var randu = require( '@stdlib/random-base-randu' );
24+
var uniform = require( '@stdlib/random-base-uniform' );
25+
var bernoulli = require( '@stdlib/random-base-bernoulli' );
26+
var filledarrayBy = require( '@stdlib/array-filled-by' );
2527
var isnan = require( '@stdlib/math-base-assert-is-nan' );
2628
var pow = require( '@stdlib/math-base-special-pow' );
2729
var pkg = require( './../package.json' ).name;
28-
var nanstdevtk = require( './../lib/nanstdevtk.js' );
30+
var nanstdevtk = require( './../lib/main.js' );
2931

3032

3133
// FUNCTIONS //
3234

35+
/**
36+
* Returns a random number.
37+
*
38+
* @private
39+
* @returns {number} random number
40+
*/
41+
function rand() {
42+
if ( bernoulli( 0.8 ) < 1 ) {
43+
return NaN;
44+
}
45+
return uniform( -10.0, 10.0 );
46+
}
47+
3348
/**
3449
* Creates a benchmark function.
3550
*
@@ -38,17 +53,7 @@ var nanstdevtk = require( './../lib/nanstdevtk.js' );
3853
* @returns {Function} benchmark function
3954
*/
4055
function createBenchmark( len ) {
41-
var x;
42-
var i;
43-
44-
x = [];
45-
for ( i = 0; i < len; i++ ) {
46-
if ( randu() < 0.2 ) {
47-
x.push( NaN );
48-
} else {
49-
x.push( ( randu()*20.0 ) - 10.0 );
50-
}
51-
}
56+
var x = filledarrayBy( len, 'generic', rand );
5257
return benchmark;
5358

5459
function benchmark( b ) {

benchmark/benchmark.ndarray.js

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121
// MODULES //
2222

2323
var bench = require( '@stdlib/bench-harness' );
24-
var randu = require( '@stdlib/random-base-randu' );
24+
var uniform = require( '@stdlib/random-base-uniform' );
25+
var bernoulli = require( '@stdlib/random-base-bernoulli' );
26+
var filledarrayBy = require( '@stdlib/array-filled-by' );
2527
var isnan = require( '@stdlib/math-base-assert-is-nan' );
2628
var pow = require( '@stdlib/math-base-special-pow' );
2729
var pkg = require( './../package.json' ).name;
@@ -30,6 +32,19 @@ var nanstdevtk = require( './../lib/ndarray.js' );
3032

3133
// FUNCTIONS //
3234

35+
/**
36+
* Returns a random number.
37+
*
38+
* @private
39+
* @returns {number} random number
40+
*/
41+
function rand() {
42+
if ( bernoulli( 0.8 ) < 1 ) {
43+
return NaN;
44+
}
45+
return uniform( -10.0, 10.0 );
46+
}
47+
3348
/**
3449
* Creates a benchmark function.
3550
*
@@ -38,17 +53,7 @@ var nanstdevtk = require( './../lib/ndarray.js' );
3853
* @returns {Function} benchmark function
3954
*/
4055
function createBenchmark( len ) {
41-
var x;
42-
var i;
43-
44-
x = [];
45-
for ( i = 0; i < len; i++ ) {
46-
if ( randu() < 0.2 ) {
47-
x.push( NaN );
48-
} else {
49-
x.push( ( randu()*20.0 ) - 10.0 );
50-
}
51-
}
56+
var x = filledarrayBy( len, 'generic', rand );
5257
return benchmark;
5358

5459
function benchmark( b ) {

dist/index.js

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)