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.nan
。np.nan
用于指示数据中存在 NaN 值。
这个新创建的数组存储在一个名为 arr 的对象中。
我们在下面的行中打印这个数组。
ndarray 的获取方式如下。
现在在输出中,您可能已经注意到了细微的差异。只是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 被零替换。
用 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 的对象中。
在下一行中,我们将打印这个数组。
由于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 的新对象中。
用 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()
。
该数组看起来像这样。
现在让我们用-100替换负无穷大。
1
2
|
n_arr2 = np.nan_to_num(arr2,neginf = - 100 ) print ( "The new array:\n" ,n_arr2) |
在上面的代码中,我们调用了该nan_to_num
函数,并将要修改的数组以及要替换负无穷大的值传递给该函数,
新的数组是:
我们可以返回输入数组的逐元素数值正值。查看这篇文章。
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 中。
用不同的数字替换多个无限值
假设您厌倦了用同一个公共数字替换多个无限值。我们可以指定不同的值,每个值对应一个无限项。
让我们看看如何做到这一点。
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()
用于将不同位置的无限值替换为替换数组元素。
它类似于where
SQL 中的函数,在该函数中我们检查特定条件来执行特定任务。
该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 的数组时,根据声明数组的方式替换这些值可能会遇到困难。查看这个堆栈溢出答案可能会解决问题。