标准差(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 位)。
