scipy.stats.circstd#

scipy.stats.circstd(samples, high=6.283185307179586, low=0, axis=None, nan_policy='propagate', *, normalize=False)[source]#

Compute the circular standard deviation for samples assumed to be in the range [low to high].

Parameters
samplesarray_like

Input array.

highfloat or int, optional

High boundary for the sample range. Default is 2*pi.

lowfloat or int, optional

Low boundary for the sample range. Default is 0.

axisint, optional

Axis along which standard deviations are computed. The default is to compute the standard deviation of the flattened array.

nan_policy{‘propagate’, ‘raise’, ‘omit’}, optional

Defines how to handle when input contains nan. ‘propagate’ returns nan, ‘raise’ throws an error, ‘omit’ performs the calculations ignoring nan values. Default is ‘propagate’.

normalizeboolean, optional

If True, the returned value is equal to sqrt(-2*log(R)) and does not depend on the variable units. If False (default), the returned value is scaled by ((high-low)/(2*pi)).

Returns
circstdfloat

Circular standard deviation.

Notes

This uses a definition of circular standard deviation from [1]. Essentially, the calculation is as follows.

C = np.cos(samples).mean()
S = np.sin(samples).mean()
R = np.sqrt(C**2 + S**2)
l = 2*np.pi / (high-low)
circstd = np.sqrt(-2*np.log(R)) / l

In the limit of small angles, it returns a number close to the ‘linear’ standard deviation.

References

1

Mardia, K. V. (1972). 2. In Statistics of Directional Data (pp. 18-24). Academic Press. DOI:10.1016/C2013-0-07425-7.

Examples

>>> from scipy.stats import circstd
>>> small_samples = [0, 0.1*np.pi/2, 0.001*np.pi, 0.03*np.pi/2]
>>> circstd(small_samples)
0.06356406330602443
>>> np.std(small_samples)
0.06355419420577858