使用 nan_to_num 替换 NaN 和 Infinity

nan_to_num是 numpy 库的一个函数,它将 NaN(不是数字)转换为数值。每当我们调用 nan_to_num 函数时,NaN 通常会被替换为零。

我们可能会遇到一些数据集,其中的记录或值可能无法表示或通常未定义。此类值称为“非数字”,也称为 NaN。

此类值的存在可能会导致数据分析项目中的计算错误。该函数nan_to_num可以消除这些值,使您的项目没有错误。

该函数在 NumPy 库中可用,也可用于将无穷大替换为我们将在接下来的示例中看到的某个数字。

NumPy 库

NumPy(Numerical Python) 是 Python 编程语言的库,它提供大型多维数组和矩阵,以及大量用于对这些数组进行操作的高级数学函数。

为什么使用 NumPy?

你可能有一个疑问;当我们在Python中有可以充当数组的列表时,为什么我们应该使用NumPy?

在 Python 中使用列表时,您应该记住一些事情。这是一篇关于列表的基本创建、访问列表元素、更新等的文章。

Python 中的列表非常类似于数组。但他们有点慢。NumPy 库提供了一个名为ndarray的特殊数组的创建,其目标是获得比列表快 50 倍的结果。

除了创建ndarray之外,NumPy 还提供了许多函数,使使用这些数组变得更加容易。


什么是 NaN?

NaN 代表不是数字。为了详细说明,让我们举个例子。

假设您遇到除零的情况。这种除法的结果是未定义的。

我们如何表示这些未定义的结果?

我们使用 NaN 来表示此类未定义或无法表示的数学运算的结果。

非数字 (NaN) 不等于无穷大

不是数字r 并不等于无穷大。原因很简单。我们知道术语“无穷大”用于表示比任何有限数大得多​​的数字。它用于表示不可数的数字或值。

但 NaN 是一个术语,用于表示 Python 中未定义操作的结果。NaN 的另一个例子是负数的平方根。

nan_to_num 函数替换无限值

除了其主要功能(用零替换 NaN)之外,nan_to_num()还用于用用户定义的数字替换无限值,这意味着我们可以自己选择替换无限值。

无穷大也可以为负数

我们已经讨论过无穷大是比任何有限数大得多​​的数。这样的数称为正无穷数。

还有一件事要知道;与任何有限数相比小得多的任何数也称为无限值,但为负数。


探索 NumPy.nan_to_num 函数

此方法将 nan 替换为零,将无穷大替换为用户定义的数字。

语法如下。

numpy.nan_to_num(x, copy=True, nan=0.0, posinf=None, neginf=None)

下面给出了语法的参数及其描述。

论据 描述 默认类型/值 必需/可选
X 输入数据 标量或类数组 必需的
复制 此参数用于指定是否应复制原始数组以进行修改,或者是否要在不重复的情况下修改原始数组。如果该值为 true,则创建数组的副本,然后应该对其进行修改如果值为 false,则不会复制原始数组,而是对原始数组本身进行修改。 布尔
值默认= True
选修的
该字段用于指定要填充 NaN 值的值。
如果没有传递任何值,则 NaN 值将被替换为 0.0
整型、浮点型
默认值 = 0.0
选修的
位置 指定用于填充正无穷大值的值。
用户可以指定要填充的值
如果没有传递任何值,则正无穷大值将被替换为一个非常大的数字
整型、浮点型 选修的
内金夫 指定用于填充负无穷大值的值
如果用户未指定任何值,则负无穷大值将被替换为非常小的(或负数)数字
整型、浮点型 选修的
论据nan_to_num

返回类型: ndarray


用零填充 Nan

在此示例中,让我们用零替换 nan 值。

首先,让我们看看如何创建一个具有 nan 值的 ndarray。

1
2
3
import numpy as np
arr = np.array([np.nan, 1, 2, 3,np.nan,24,25,26])
print("Original Array:\n", arr)

这是上面代码片段的快速解释。

import numpy as np首先,我们导入 numpy 库来创建一个数组。numpy 的标准和可接受的别名是 np。

接下来,我们在 的帮助下创建一个具有 nan 值的数组np.nannp.nan用于指示数据中存在 NaN 值。

这个新创建的数组存储在一个名为 arr 的对象中。

我们在下面的行中打印这个数组。

ndarray 的获取方式如下。

原始数组1

现在在输出中,您可能已经注意到了细微的差异。只是sincenp.nan是Python中一个特殊的浮点值。NaN 有一个与之关联的浮点数据类型。由于数组中元素的主要规则是它们都应该具有相同的数据类型,因此所有元素都将转换为浮点型。

让我们看看 nan 值的替换。

1
2
3
# Replace NaN with 0
new_arr = np.nan_to_num(arr, nan=0.0)
print("\nArray with NaN replaced by 0:\n", new_arr)

现在,我们正在进入有趣的部分。

在第二行中,我们调用了该nan_to_num函数。该函数中传递的参数是需要修改的数组以及我们将用来替换 NaN 的值。

nan=0.0即使原始数组中有多个 NaN 值,我们也不需要多次指定。只需指定一次即可完成工作。

之后,我们将得到一个新数组,其中 NaN 被零替换。

NaN 替换为零

用 posinf 替换无限值

在此示例中,让我们看看使用关键字将无穷大替换为正数posinf

用于posinf 替换正无限值。

我们可以借助另一个关键字来创建正的无限值,就像np.nan. 这个关键字是np.inf.

让我们看看如何创建一个无穷大的数组。

1
2
arr1=np.array([1,2,3,np.inf,4,5,6,np.inf,7,8,9,np.inf])
print("Original array:\n",arr1)

在第一行中,我们创建一个具有正无穷大值的数组并将其存储在名为 arr1 的对象中。

在下一行中,我们将打印这个数组。

原始数组2

由于np.inf也是浮点关键字,因此该数组中的元素将转换为浮点数。

我们将用100 代替无穷大。

1
2
n_arr1=np.nan_to_num(arr1,posinf=100)
print("The new array:\n",n_arr1)

使用关键字将正无限值替换为 100 posinf

nan_to_num 被调用,并且要修改的数组和要替换无限值的值作为参数给出。该数组存储在名为 n_arr1 的新对象中。

无穷大替换为 100

用 neginf 替换无限值

在此示例中,让我们看看使用关键字将无穷大替换为负数neginf

让我们以负无穷大为例。

1
2
arr2=np.array([1,2,3,-np.inf,4,5,6,-np.inf,7,8,9,-np.inf])
print("Original array:\n",arr2)

用于-np.inf表示负无穷值。

我们正在创建一个具有无限负值的数组并将其存储在名为 arr2 的对象中。

接下来,我们在 的帮助下打印数组print()

该数组看起来像这样。

原始数组3

现在让我们用-100替换负无穷大

1
2
n_arr2=np.nan_to_num(arr2,neginf=-100)
print("The new array:\n",n_arr2)

在上面的代码中,我们调用了该nan_to_num函数,并将要修改的数组以及要替换负无穷大的值传递给该函数,

新的数组是:

负无限替换为 100

我们可以返回输入数组的逐元素数值正值。查看这篇文章。

如何从输入数组中返回正值?


NaN、np 的组合。inf,-np。信息

nan让我们看一下、posinf的组合示例neginf

代码如下所示。

1
2
3
4
5
6
#np array with nan,positive infinity and negative infinity
arr=np.array([1,3,4,np.nan,7,6,8,np.inf,2,5,9,-np.inf,21])
print("Original array:\n",arr)
#replacing the values
newarr=np.nan_to_num(arr,nan=0,posinf=100,neginf=-100)
print("Modified array:\n",newarr)

第二行显示了如何创建一个具有 nan、正无穷和负无穷值的数组。该数组存储在 arr 中。

在下面的行中,我们将打印这个原始数组。

在第五行中,我们正在调用该nan_to_num函数。参数是原始数组、NaN 的替换、正无穷大和负无穷大。修改后的数组存储在 newarr 中。

NaN、正无穷大和负无穷大的组合

用不同的数字替换多个无限值

假设您厌倦了用同一个公共数字替换多个无限值。我们可以指定不同的值,每个值对应一个无限项。

让我们看看如何做到这一点。

1
2
3
4
5
6
7
import numpy as np
arr1 = np.array([1, 2, 3, np.inf, 4, 5, 6, np.inf, 7, 8, 9, np.inf])
print("Original array:\n", arr1)
# array of replacement values
rep = np.array([40,50,60])
arr2 = np.where(arr1 == np.inf, np.tile(reps, int(len(arr1)/len(reps))), arr1)
print("Modified array:\n", arr2)

import numpy as np:在这一行中,我们将 NumPy 库导入为 np.

在下面的行中,我们创建一个包含 12 个元素的数组,其中三个是无限值。该数组存储在名为 arr1 的对象中。

我们将在下一行打印数组。

我们正在为原始数组创建一个替换值数组。由于原始数组中有三个无限值,因此替换数组有三个元素。该数组存储在rep中。

在下面的行中,我们为修改后的数组创建另一个名为 arr2 的数组。

该条件np.where()用于将不同位置的无限值替换为替换数组元素。

它类似于whereSQL 中的函数,在该函数中我们检查特定条件来执行特定任务。

np.where条件采用三个参数。让我们一一看看它们是什么。

arr1==np.inf:这是一个布尔条件,如果原始数组中的任何位置包含无限值,则返回 true;如果该位置不包含无限值,则返回 false。

例如,在原始数组 (arr1) 中,考虑到数组中的索引从零开始,此条件对于第三个位置返回 true,对于第零个位置返回 false。

np.tile(rep, int(len(arr1)/len(rep))):该参数用于匹配两个数组的长度。原始数组(arr1)的长度为12。但是替换数组(rep)的长度为3。因此我们不能将替换数组与原始数组一起使用。

该参数确保两个数组的长度匹配。len(arr1)/len(rep)返回 4。因此,rep 数组必须重复 4 次才能使其长度为 12。

arr1当为 false 时使用此参数arr1==np.inf也就是说,它确保原始数组中的非无限值保留在修改后的数组中的相同位置。

输出如下所示。

用不同的值替换无穷大

概括

总而言之,我们已经了解了什么是“非数字”以及为什么 NaN 不等于无穷大。我们还看到无穷大也可以是负数。

np.nan_to_num接下来,我们看到函数及其参数的语法。

在示例中,首先,我们了解了如何在 的帮助下创建 NaNnp.nan以及如何在 的帮助下将 nan 替换为 0 nan_to_num我们还看到,具有 NaN 值的数组被转换为浮点数据类型。

接下来,我们看到了如何使用 来创建正无穷大np.posinf并用 替换该无穷大posinf

类似地,我们也看到了用 代替负无穷大neginf

我们已经看到了具有所有三个的数组的转换:NaN、正无穷大和负无穷大。

最后,我们看到了用不同的数字替换多个无限值。

参考

nan_to_num 官方 Numpy 手册

在使用元素为 NaN 的数组时,根据声明数组的方式替换这些值可能会遇到困难。查看这个堆栈溢出答案可能会解决问题。