NumPy 求标准差

标准差(Standard Deviation),又称 “均方差” ,它是方差的平方根。标准差和方差一样,都是用于表示一组数据的离散程度。

对于标准差来说,它具有以下性质:

  • 标准差越大,表示数据越分散。
  • 标准差越小,表示数据越集中。
  • 标准差为 0,表示所有数据都相等。
  • 样本标准差通常通过自由度修正(ddof=1)来获得无偏估计。

NumPy 求标准差函数

在 NumPy 中,我们可以使用 std() 函数来计算数组的标准差。其中,std 是 “STandard Deviation” 的简写。

语法:

numpy.std(
    arr,
    axis=None,
    dtype=None,
    out=None,
    ddof=0,
    keepdims=False,
    where=True
)

说明:

std() 函数接收以下参数。对于初学的小伙伴来说,只需要掌握前 3 个即可。

  • arr(必选):是一个数组
  • axis(可选,默认:None):指定沿着哪个轴计算标准差。
    • 默认值为 None,表示计算整个数组的标准差。
    • 对于二维数组来说:axis=0 表示计算每一列的标准差(竖着算),axis=1 表示计算每一行的标准差(横着算)。
    • 如果 axis 是一个元组,则表示在指定的多个轴上计算标准差。
  • ddof(可选,默认:0):用于指定自由度修正量,默认为 0。
    • 当 ddof=0 时,表示计算总体方差(分母是 N)。
    • 当 ddof=1 时,表示计算样本方差(分母是 N-1,更符合统计学要求)。
  • dtype(可选,默认:None):用于指定输出数组的数据类型。如果没有指定,NumPy 将根据输入数组的类型和计算过程自动选择合适的数据类型,通常会选择浮点类型以保证精度。
  • out(可选,默认:None):用于指定将计算结果存储到的现有数组。out 参数必须具有与预期输出相同的形状和数据类型(或可以安全地进行类型转换)。使用 out 参数可以避免创建新的数组,从而在某些情况下提高性能。
  • keepdims(可选,默认:False):是一个布尔值。如果设置为 True,则保留计算结果的维度。例如,如果对一个二维数组沿某个轴计算标准差,结果默认会降为一维数组。如果 keepdims 设置为 True,结果仍然是二维数组,但被缩减的轴的长度为 1。
  • where(可选,默认:True):是一个布尔型数组或可以广播到输入数组的条件表达式,用于指定哪些元素参与标准差的计算。只有 where 中对应为 True 的元素才会被计算,False 的元素会被忽略。默认值为 True,表示所有元素都参与计算。where 数组的形状需要与输入数组 arr 的形状兼容。

提示: 标准差与方差非常相似,另请参阅:NumPy 求方差

NumPy 求标准差示例

接下来,我们通过几个简单的例子来讲解一下 NumPy 是如何求标准差的。

示例 1:一维数组的基本计算

import numpy as np

data = np.array([2, 4, 6, 8])

# 总体标准差
print(np.std(data))
# 样本标准差
print(np.std(data, ddof=1))

运行结果如下。

2.23606797749979
2.581988897471611

分析:

当我们不指定 ddof 参数时,它会使用默认值 0,此时表示计算 “总体标准差” 。当我们设置 ddof=1 时,此时表示会计算 “样本标准差” 。

样本标准差的分母是 n-1,而总体标准差的分母是 n。因为 n-1 小于 n,所以样本标准差的结果会略大于总体标准差。

示例 2:二维数组的轴向计算

import numpy as np

arr = np.array([[1, 2], [3, 4]])

# 全局标准差
print(np.std(arr))
# 每列标准差(沿行计算)
print(np.std(arr, axis=0))
# 每行标准差(沿列计算)
print(np.std(arr, axis=1))

运行结果如下。

1.118033988749895
[1. 1.]
[0.5 0.5]

分析:

我们可以通过指定 axis 参数,然后分别计算行或列方向的标准差。

  • 当没有指定 axis 时,np.std(arr) 会将整个数组展平,然后计算所有元素的标准差。
  • 当 axis=0 时,函数会沿着 “列(竖方向)” 计算标准差。它会分别计算第一列 [1, 3] 和第二列 [2, 4] 的标准差,结果是一个包含两个元素的数组。
  • 当 axis=1 时,函数会沿着 “行(横方向)” 计算标准差。它会分别计算第一行 [1, 2] 和第二行 [3, 4] 的标准差,结果是一个包含两个元素的数组。

示例 3:保持维度(keepdims=True)

import numpy as np

arr = np.array([[1, 2], [3, 4]])
result = np.std(arr, axis=0, keepdims=True)

print(result.shape)

运行结果如下。

(1, 2)

分析:

在这个例子中,原数组形状为 (2, 2),沿 axis=0 计算后,形状变为 (1, 2)。也就是说,沿着行的方向(axis=0)对每一列计算标准差后,结果的列数保持不变,而行数会变为 1。

示例 4:条件筛选(where 参数)

import numpy as np

arr = np.array([10, 20, 30, 40])
condition = np.array([True, False, True, False])
result = np.std(arr, where=condition)           # 计算筛选后的标准差

print(result)

运行结果如下。

10.0

分析:

参数 where 用于筛选有效数据,这种方式本质上是使用了 “NumPy 布尔索引” 的语法。

对于这个例子来说,np.std(arr, where=condition) 只会计算 arr 中对应 condition 为 True 的元素(此处为第 0、2 位)。

上一篇: NumPy 求方差

下一篇: NumPy 求分位数

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号