Python数据分析系列之Numpy常用操作第九篇

737 阅读5分钟

这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战
在使用Numpy的过程中,如果不加注意,就会很容易踩坑,下面列出在Numpy使用过程中的尤其需要注意的地方:

这篇主要列出使用Numpy编程中需要注意的几个方面:

  1. NaN的等值判断
  2. Numpy数值中包含NaN值的求和方法
  3. Numpy数组中包含NaN值时获取最小大值或索引的方法
  4. 判断是否无穷大
  5. 判断是否是无穷大或是NaN
  6. 在统计时把NaN的值映射为0
NaN的判断

在Python中,当需要对两个对象的值进行等值判断时,只需要使用两个等于号即可,但是在Numpy中判断两个NaN是否相等时用两个等于号判断是错误的。NaN数值的判断不能使用常见的==进行判断,正确的方法是需要使用Numpy的isnan函数进行判断:
下面的例子第一个使用两个等于号进行获取ndarray中是nan的数据,返回的是空数组;

In [1]: import numpy as np

In [2]: data = np.array([0, 99, np.nan])

In [3]: data
Out[3]: array([ 0., 99., nan])

In [4]: data[data == np.nan]
Out[4]: array([], dtype=float64)

numpy.isnan(ndarray): 返回ndarray里面是nan的数据,返回的是有多个nan元素的数组。
下面的例子包含有一个nan数据,使用numpy.isnan(ndarray)获取ndarray中是nan的数据时,返回的数据是符合预期的。

In [5]: data[np.isnan(data)]
Out[5]: array([nan])
Numpy数值中包含NaN值的求和方法

在Numpy数组中,对所有元素都是正常数组的数据进行求和会是很简单。如果Numpy数组中存在了NaN数值,在求和时则需要注意,正确的方法是使用Numpy所提供的numpy.nansum(numpy数组)进行求和。
numpy.nansum(numpy数组):此方法返回包含NaN缺失值的数组的累加值。

下面的例子返回0到9的累计值,其中第四个为NaN值,使用numpy.nansum(numpy数组)正确返回了42。
构造包含NaN值的数组:

In [9]: data = np.arange(10.)

In [10]: data
Out[10]: array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])

In [11]: data[3] = np.nan

In [12]: data
Out[12]: array([ 0.,  1.,  2., nan,  4.,  5.,  6.,  7.,  8.,  9.])

使用numpy.nansum(numpy数组)获取除了NaN外的求和:0到9的累加和(剔除NaN):42

In [13]: np.nansum(data)
Out[13]: 42.0

使用numpy.nansum(numpy数组)获取除了NaN外的求和:0到9的累加和:45

In [14]: np.nansum(np.arange(10.))
Out[14]: 45.0
Numpy数组中包含NaN值时获取最小大值或索引的方法

当在存在NaN值的数组总获取最大值、最小值或者最大值索引和最小值索引时,需要注意的是使用Numpy自带的正确方法:

  1. np.nanmin(data):返回存在NaN缺失值的data数组中的最小值
  2. np.nanmax(data):返回存在NaN缺失值的data数组中的最大值
  3. np.nanargmin(data):获取存在NaN缺失值的data数组数组中非NaN最小值的索引
  4. np.nanargmax(data):获取存在NaN缺失值的data数组数组中非NaN最大值的索引 构造存在NaN缺失值的数组:
In [9]: data = np.arange(10.)

In [10]: data
Out[10]: array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])

In [11]: data[3] = np.nan

In [12]: data
Out[12]: array([ 0.,  1.,  2., nan,  4.,  5.,  6.,  7.,  8.,  9.])

使用np.nanmin(data)方法返回存在NaN缺失值的data数组中的最小值

In [15]: np.nanmax(data)
Out[15]: 9.0

使用np.nanmax(data)方法返回存在NaN缺失值的data数组中的最小值

In [16]: np.nanmin(data)
Out[16]: 0.0

使用np.nanargmin(data)方法获取存在NaN缺失值的data数组数组中非NaN最小值的索引

In [17]: np.nanargmin(data)
Out[17]: 0

使用np.nanargmax(data)方法获取存在NaN缺失值的data数组数组中非NaN最大值的索引

In [18]: np.nanargmax(data)
Out[18]: 9
判断是否无穷大

在Numpy中,表示一个数值是无穷大是使用:np.inf。当需要判断一个数值是否无穷大时应该使用以下方法:
numpy.isinf(value): 判断value是否是无穷大,是的话返回True,否则返回False

In [20]: data = np.array([0.,  1.,  2.,  3., np.inf])

In [21]: data.isinf(np.inf)
Out[22]: True
判断是否是无穷大或是NaN

在Numpy中,表示一个数值是无穷大是使用:np.inf。当需要判断一个数值是否无穷大时应该使用以下方法:
numpy.isinf(value): 判断value是否是无穷大,是的话返回True,否则返回False
但当需要判断一个数值是否有穷或者不是NaN是,则需要使用以下方法:
np.isfinite(value): 判断value是否是有穷的。当是无穷大或是NaN返回False,当不是无穷大或不是NaN返回True。

下面的例子判断是否有穷:

np.isfinite(value)当是无穷大或是NaN返回False

In [24]: np.isfinite(np.inf)
Out[24]: False

In [25]: np.isfinite(np.NaN)
Out[25]: False

np.isfinite(value)当不是无穷大或不是NaN返回True

In [26]: np.isfinite(2)
Out[26]: True
把NaN的值映射为其他值

当我们进行数据处理时,总会存在缺失值的情况,那么Numpy提供我们可以在不修改数据的情况下,在计算时把缺失值统一映射成你想设定的值。

np.nan_to_num(np.nan): 此方法把nan映射为0

In [27]: np.nan_to_num(np.nan)
Out[27]: 0.0

np.nan_to_num(np.inf): 此方法把np.inf映射成float的最大值

In [28]: np.nan_to_num(np.inf)
Out[28]: 1.7976931348623157e+308

np.nan_to_num(np.NINF)把np.NINF映射成float的最小值

In [29]: np.nan_to_num(np.NINF)
Out[29]: -1.7976931348623157e+308