numpy中处理含nan数据的统计函数及其效率

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了numpy中处理含nan数据的统计函数及其效率相关的知识,希望对你有一定的参考价值。

参考技术A numpy 库中的一些统计函数,它们在遇到含 nan 的数据时都无法正常使用,需要换成可用的同名函数(即在函数名前加“nan”)。

沿指定轴返回一个数组的最小 / 大值。
numpy.max(a, axis=None, out=None, keepdims=<no value>)
参数:
a - array_like ,数组或者可以转化成数组的对象
axis - 无 None(默认)、整型 int、元组 tuple;沿轴线方向的操作方式

计算数组中沿指定方向上的第q 数值百分位(点),可以计算多维数组的任意百分比分位数
numpy.percentile(a, q, axis=None, out=None, overwrite_input=False, interpolation='linear', keepdims=False)
参数:
a - array_like ,数组或者可以转化成数组的对象
q - [ 0., 100. ] 百分位
overwrite_input - bool 型参数,为 True 并且 a 的类型是ndarray,则 a 将被部分后者全部排序
axis - 无 None(默认)、整型 int、元组 tuple;沿轴线方向的操作方式

计算数组 a 在沿 axis 轴方向上的中位数
numpy.median(a, axis=None, out=None, overwrite_input=False, keepdims=False)
参数:
a - array_like ,数组或者可以转化成数组的对象
overwrite_input - bool 型参数,为 True 并且 a 的类型是ndarray,则 a 将被部分后者全部排序
axis - 无 None(默认)、整型 int、元组 tuple;沿轴线方向的操作方式

沿指定轴计算数组的标准偏差。
numpy.std(a, axis=None, dtype=None, out=None, ddof=0, keepdims=<no value>)
参数:
a - array_like ,数组或者可以转化成数组的对象
ddof - 自由度,计算时的分母为 N(数据数量) - ddof,默认 ddof = 0
axis - 无 None(默认)、整型 int、元组 tuple;沿轴线方向的操作方式

沿指定轴计算数组的方差 var 【 = mean(abs(x - x.mean()) ** 2)】。
numpy.var(a, axis=None, dtype=None, out=None, ddof=0, keepdims=<no value>)
参数:
a - array_like ,数组或者可以转化成数组的对象
ddof - 自由度,计算时的分母为 N(数据数量) - ddof,默认 ddof = 0
axis - 无 None(默认)、整型 int、元组 tuple;沿轴线方向的操作方式

在含有 nan 数值的数组上采用不带 “nan”前缀的统计函数处理,结果都是返回 nan ,需要换成带 “nan”前缀的同名统计函数处理。

以取包含 nan 的数组里的最大值为例,有以下方法

其中,第 2、3 个的时间差几乎为0,看看耗时到底多少?

可见,耗时最多的是 直接对 Series 取 .max(),耗时最少的是用 np.max() 求数组的最大值。
其他函数也类似。

参考资料:
1、 numpy 统计函数
2、 numpy的np.nanmax和np.array([1,2,3,np.nan]).max()的区别(坑)

numpy数学数据处理

数学和统计方法

  • sum 对数组中全部或某轴向的元素求和。零长度的数组的sum为0。
  • mean 算术平均数。零长度的数组的mean为NaN。
    import numpy as np
    import numpy.random as np_random
    
    arr = np.random.randn(5,4)
    print(arr)
    print(arr.sum())  #求总和:所有元素相加
    print(arr.mean()) #求平均值:所有元素相加后除以元素总数
    print(arr.mean(axis=1))
    
    print(arr.cumsum(0))

     

  • std, var 分别为标准差和方差,自由度可调(默认为n)。
  • min, max 最大值和最小值
  • argmin 分别为最大值和最小值的索引
  • cumsum 所有元素的累计和
  • cumprod 所有元素的累计积

 

Any、All测试布尔型数组

bools = np.array([False,True,False,False])
print(bools.any())  #有一个为True就返回True
print(bools.all())  #所有为True返回True

 

sort排序

arr = np_random.randn(8)
arr.sort()
print(arr)

arr = np_random.randn(5,3)
arr.sort(1)  #指定轴排序

 

去重与其他集合运算

  • unique(x) 计算x中的唯一元素,并返回有序结果。
  • intersect1d(x, y) 计算x和y中的公共元素,并返回有序结果。
  • union1d(x, y) 计算x和y的并集,并返回有序结果。
  • in1d(x, y) 得到一个表述"x的元素是否包含于y"的布尔型数组
  • setdiff1d(x, y) 集合的差,即元素在x中且不在y中
  • setxor1d(x, y) 集合的异或,即存在于一个数组中但不同时存在于两个数组中的元素。
  • names = np.array([Bob, Joe, Will, Bob, Will, Joe, Joe])
    print(np.unique(names)) #Bob‘, ‘Joe‘, ‘Will‘
    ints = np.array([3, 3, 3, 2, 2, 1, 1, 4, 4])
    print(np.unique(ints))  #1 2 3 4
    #‘查找数组元素是否在另一数组‘
    values = np.array([6, 0, 0, 3, 2, 5, 6])
    print(np.in1d(values, [2, 3, 6]))

 


以上是关于numpy中处理含nan数据的统计函数及其效率的主要内容,如果未能解决你的问题,请参考以下文章

统计量及其抽样分布

python数据分析之Pandas:汇总和计算描述统计

numpy数学数据处理

NumPy 中的数据统计分析

06 pandas DataFrame - 数据过滤、NaN处理、统计方法

isNaN+parseFloat进行统计以及对NaN的处理