`z`. :math:`|z|` in the above expression is known as the `mean resultant length`. Parameters ---------- samples : array_like Input array of angle observations. The value of a full angle is equal to ``(high - low)``. high : float, optional Upper boundary of the principal value of an angle. Default is ``2*pi``. low : float, optional Lower boundary of the principal value of an angle. Default is ``0``. normalize : boolean, optional If ``False`` (the default), the return value is computed from the above formula with the input scaled by ``(2*pi)/(high-low)`` and the output scaled (back) by ``(high-low)/(2*pi)``. If ``True``, the output is not scaled and is returned directly. Returns ------- circstd : float Circular standard deviation, optionally normalized. If the input array is empty, ``np.nan`` is returned. See Also -------- circmean : Circular mean. circvar : Circular variance. Notes ----- In the limit of small angles, the circular standard deviation is close to the 'linear' standard deviation if ``normalize`` is ``False``. References ---------- .. [1] Mardia, K. V. (1972). 2. In *Statistics of Directional Data* (pp. 18-24). Academic Press. :doi:`10.1016/C2013-0-07425-7`. .. [2] Mardia, K. V. and Jupp, P. E. *Directional Statistics*. John Wiley & Sons, 1999. Examples -------- >>> import numpy as np >>> from scipy.stats import circstd >>> import matplotlib.pyplot as plt >>> samples_1 = np.array([0.072, -0.158, 0.077, 0.108, 0.286, ... 0.133, -0.473, -0.001, -0.348, 0.131]) >>> samples_2 = np.array([0.111, -0.879, 0.078, 0.733, 0.421, ... 0.104, -0.136, -0.867, 0.012, 0.105]) >>> circstd_1 = circstd(samples_1) >>> circstd_2 = circstd(samples_2) Plot the samples. >>> fig, (left, right) = plt.subplots(ncols=2) >>> for image in (left, right): ... image.plot(np.cos(np.linspace(0, 2*np.pi, 500)), ... np.sin(np.linspace(0, 2*np.pi, 500)), ... c='k') ... image.axis('equal') ... image.axis('off') >>> left.scatter(np.cos(samples_1), np.sin(samples_1), c='k', s=15) >>> left.set_title(f"circular std: {np.round(circstd_1, 2)!r}") >>> right.plot(np.cos(np.linspace(0, 2*np.pi, 500)), ... np.sin(np.linspace(0, 2*np.pi, 500)), ... c='k') >>> right.scatter(np.cos(samples_2), np.sin(samples_2), c='k', s=15) >>> right.set_title(f"circular std: {np.round(circstd_2, 2)!r}") >>> plt.show() rO