Skip to content

Commit be15d62

Browse files
authored
fix keepdims for std, update docs (#704)
1 parent 903506c commit be15d62

9 files changed

+366
-258
lines changed

code/numpy/numerical.c

+3-2
Original file line numberDiff line numberDiff line change
@@ -603,8 +603,9 @@ static mp_obj_t numerical_function(size_t n_args, const mp_obj_t *pos_args, mp_m
603603
case NUMERICAL_ARGMAX:
604604
COMPLEX_DTYPE_NOT_IMPLEMENTED(ndarray->dtype)
605605
return numerical_argmin_argmax_ndarray(ndarray, keepdims, axis, optype);
606-
case NUMERICAL_SUM:
607606
case NUMERICAL_MEAN:
607+
case NUMERICAL_STD:
608+
case NUMERICAL_SUM:
608609
COMPLEX_DTYPE_NOT_IMPLEMENTED(ndarray->dtype)
609610
return numerical_sum_mean_std_ndarray(ndarray, axis, keepdims, optype, 0);
610611
default:
@@ -1398,7 +1399,7 @@ mp_obj_t numerical_std(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_arg
13981399
mp_obj_t oin = args[0].u_obj;
13991400
mp_obj_t axis = args[1].u_obj;
14001401
size_t ddof = args[2].u_int;
1401-
mp_obj_t keepdims = args[2].u_obj;
1402+
mp_obj_t keepdims = args[3].u_obj;
14021403

14031404
if((axis != mp_const_none) && (mp_obj_get_int(axis) != 0) && (mp_obj_get_int(axis) != 1)) {
14041405
// this seems to pass with False, and True...

code/numpy/numerical.h

-130
Original file line numberDiff line numberDiff line change
@@ -57,35 +57,9 @@
5757
(rarray) += (results)->itemsize;\
5858
})
5959

60-
// The mean could be calculated by simply dividing the sum by
61-
// the number of elements, but that method is numerically unstable
62-
#define RUN_MEAN1(type, array, rarray, ss)\
63-
({\
64-
mp_float_t M = 0.0;\
65-
for(size_t i=0; i < (ss).shape[0]; i++) {\
66-
mp_float_t value = (mp_float_t)(*(type *)(array));\
67-
M = M + (value - M) / (mp_float_t)(i+1);\
68-
(array) += (ss).strides[0];\
69-
}\
70-
*(rarray)++ = M;\
71-
})
72-
7360
// Instead of the straightforward implementation of the definition,
7461
// we take the numerically stable Welford algorithm here
7562
// https://www.johndcook.com/blog/2008/09/26/comparing-three-methods-of-computing-standard-deviation/
76-
#define RUN_STD1(type, array, rarray, ss, div)\
77-
({\
78-
mp_float_t M = 0.0, m = 0.0, S = 0.0;\
79-
for(size_t i=0; i < (ss).shape[0]; i++) {\
80-
mp_float_t value = (mp_float_t)(*(type *)(array));\
81-
m = M + (value - M) / (mp_float_t)(i+1);\
82-
S = S + (value - M) * (value - m);\
83-
M = m;\
84-
(array) += (ss).strides[0];\
85-
}\
86-
*(rarray)++ = MICROPY_FLOAT_C_FUN(sqrt)(S / (div));\
87-
})
88-
8963
#define RUN_MEAN_STD1(type, array, rarray, ss, div, isStd)\
9064
({\
9165
mp_float_t M = 0.0, m = 0.0, S = 0.0;\
@@ -193,14 +167,6 @@
193167
RUN_SUM1(type, (array), (results), (rarray), (ss));\
194168
} while(0)
195169

196-
#define RUN_MEAN(type, array, rarray, ss) do {\
197-
RUN_MEAN1(type, (array), (rarray), (ss));\
198-
} while(0)
199-
200-
#define RUN_STD(type, array, rarray, ss, div) do {\
201-
RUN_STD1(type, (array), (results), (rarray), (ss), (div));\
202-
} while(0)
203-
204170
#define RUN_MEAN_STD(type, array, rarray, ss, div, isStd) do {\
205171
RUN_MEAN_STD1(type, (array), (rarray), (ss), (div), (isStd));\
206172
} while(0)
@@ -234,26 +200,6 @@
234200
} while(l < (ss).shape[ULAB_MAX_DIMS - 1]);\
235201
} while(0)
236202

237-
#define RUN_MEAN(type, array, rarray, ss) do {\
238-
size_t l = 0;\
239-
do {\
240-
RUN_MEAN1(type, (array), (rarray), (ss));\
241-
(array) -= (ss).strides[0] * (ss).shape[0];\
242-
(array) += (ss).strides[ULAB_MAX_DIMS - 1];\
243-
l++;\
244-
} while(l < (ss).shape[ULAB_MAX_DIMS - 1]);\
245-
} while(0)
246-
247-
#define RUN_STD(type, array, rarray, ss, div) do {\
248-
size_t l = 0;\
249-
do {\
250-
RUN_STD1(type, (array), (rarray), (ss), (div));\
251-
(array) -= (ss).strides[0] * (ss).shape[0];\
252-
(array) += (ss).strides[ULAB_MAX_DIMS - 1];\
253-
l++;\
254-
} while(l < (ss).shape[ULAB_MAX_DIMS - 1]);\
255-
} while(0)
256-
257203
#define RUN_MEAN_STD(type, array, rarray, ss, div, isStd) do {\
258204
size_t l = 0;\
259205
do {\
@@ -325,38 +271,6 @@
325271
} while(k < (ss).shape[ULAB_MAX_DIMS - 2]);\
326272
} while(0)
327273

328-
#define RUN_MEAN(type, array, rarray, ss) do {\
329-
size_t k = 0;\
330-
do {\
331-
size_t l = 0;\
332-
do {\
333-
RUN_MEAN1(type, (array), (rarray), (ss));\
334-
(array) -= (ss).strides[0] * (ss).shape[0];\
335-
(array) += (ss).strides[ULAB_MAX_DIMS - 1];\
336-
l++;\
337-
} while(l < (ss).shape[ULAB_MAX_DIMS - 1]);\
338-
(array) -= (ss).strides[ULAB_MAX_DIMS - 1] * (ss).shape[ULAB_MAX_DIMS - 1];\
339-
(array) += (ss).strides[ULAB_MAX_DIMS - 2];\
340-
k++;\
341-
} while(k < (ss).shape[ULAB_MAX_DIMS - 2]);\
342-
} while(0)
343-
344-
#define RUN_STD(type, array, rarray, ss, div) do {\
345-
size_t k = 0;\
346-
do {\
347-
size_t l = 0;\
348-
do {\
349-
RUN_STD1(type, (array), (rarray), (ss), (div));\
350-
(array) -= (ss).strides[0] * (ss).shape[0];\
351-
(array) += (ss).strides[ULAB_MAX_DIMS - 1];\
352-
l++;\
353-
} while(l < (ss).shape[ULAB_MAX_DIMS - 1]);\
354-
(array) -= (ss).strides[ULAB_MAX_DIMS - 1] * (ss).shape[ULAB_MAX_DIMS - 1];\
355-
(array) += (ss).strides[ULAB_MAX_DIMS - 2];\
356-
k++;\
357-
} while(k < (ss).shape[ULAB_MAX_DIMS - 2]);\
358-
} while(0)
359-
360274
#define RUN_MEAN_STD(type, array, rarray, ss, div, isStd) do {\
361275
size_t k = 0;\
362276
do {\
@@ -467,50 +381,6 @@
467381
} while(j < (ss).shape[ULAB_MAX_DIMS - 3]);\
468382
} while(0)
469383

470-
#define RUN_MEAN(type, array, rarray, ss) do {\
471-
size_t j = 0;\
472-
do {\
473-
size_t k = 0;\
474-
do {\
475-
size_t l = 0;\
476-
do {\
477-
RUN_MEAN1(type, (array), (rarray), (ss));\
478-
(array) -= (ss).strides[0] * (ss).shape[0];\
479-
(array) += (ss).strides[ULAB_MAX_DIMS - 1];\
480-
l++;\
481-
} while(l < (ss).shape[ULAB_MAX_DIMS - 1]);\
482-
(array) -= (ss).strides[ULAB_MAX_DIMS - 1] * (ss).shape[ULAB_MAX_DIMS - 1];\
483-
(array) += (ss).strides[ULAB_MAX_DIMS - 2];\
484-
k++;\
485-
} while(k < (ss).shape[ULAB_MAX_DIMS - 2]);\
486-
(array) -= (ss).strides[ULAB_MAX_DIMS - 2] * (ss).shape[ULAB_MAX_DIMS - 2];\
487-
(array) += (ss).strides[ULAB_MAX_DIMS - 3];\
488-
j++;\
489-
} while(j < (ss).shape[ULAB_MAX_DIMS - 3]);\
490-
} while(0)
491-
492-
#define RUN_STD(type, array, rarray, ss, div) do {\
493-
size_t j = 0;\
494-
do {\
495-
size_t k = 0;\
496-
do {\
497-
size_t l = 0;\
498-
do {\
499-
RUN_STD1(type, (array), (rarray), (ss), (div));\
500-
(array) -= (ss).strides[0] * (ss).shape[0];\
501-
(array) += (ss).strides[ULAB_MAX_DIMS - 1];\
502-
l++;\
503-
} while(l < (ss).shape[ULAB_MAX_DIMS - 1]);\
504-
(array) -= (ss).strides[ULAB_MAX_DIMS - 1] * (ss).shape[ULAB_MAX_DIMS - 1];\
505-
(array) += (ss).strides[ULAB_MAX_DIMS - 2];\
506-
k++;\
507-
} while(k < (ss).shape[ULAB_MAX_DIMS - 2]);\
508-
(array) -= (ss).strides[ULAB_MAX_DIMS - 2] * (ss).shape[ULAB_MAX_DIMS - 2];\
509-
(array) += (ss).strides[ULAB_MAX_DIMS - 3];\
510-
j++;\
511-
} while(j < (ss).shape[ULAB_MAX_DIMS - 3]);\
512-
} while(0)
513-
514384
#define RUN_MEAN_STD(type, array, rarray, ss, div, isStd) do {\
515385
size_t j = 0;\
516386
do {\

code/ulab.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
#include "user/user.h"
3434
#include "utils/utils.h"
3535

36-
#define ULAB_VERSION 6.7.1
36+
#define ULAB_VERSION 6.7.2
3737
#define xstr(s) str(s)
3838
#define str(s) #s
3939

docs/manual/source/conf.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,12 @@
2323
# -- Project information -----------------------------------------------------
2424

2525
project = 'The ulab book'
26-
copyright = '2019-2024, Zoltán Vörös and contributors'
26+
copyright = '2019-2025, Zoltán Vörös and contributors'
2727
author = 'Zoltán Vörös'
2828

2929
# The full version, including alpha/beta/rc tags
30-
release = '6.6.0'
30+
release = '6.7.2'
31+
3132

3233
# -- General configuration ---------------------------------------------------
3334

docs/manual/source/index.rst

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ Welcome to the ulab book!
2323
numpy-fft
2424
numpy-linalg
2525
numpy-random
26+
scipy-integrate
2627
scipy-linalg
2728
scipy-optimize
2829
scipy-signal

0 commit comments

Comments
 (0)