如何创建一个NumPy数组并将其填充为NaN值?

5,001 阅读4分钟

NaN代表 不是一个数字.它是一个占位符,表示没有价值。人们可以把它看作是None0 。只是None0 属于一个特定的类型。然而,NaN却不是。

我们用NaN来表示缺失的数据或无法执行某些操作。在进行复杂的计算时,如果用户试图做一个不可能的任务(例如,对一个负值进行对数计算),并不是抛出一个错误并使程序崩溃,而是返回NaN

NumPyNaN 定义为一个常量值。要在你的程序中使用它,请使用 numpy.nan

import numpy as np
np.nan

在这篇文章中,让我们来学习如何创建一个充满NaN 的数组。

方法1:使用numpy.full()

创建一个带有NaN值的NumPy数组的最简单方法之一是使用 [numpy.full()](https://numpy.org/doc/stable/reference/generated/numpy.full.html#numpy-full)方法。然而,numpy.full() ,在NumPy 1.8以上版本中可以使用。

要创建一个行数为rows ,列数为cols ,充满NaN值的numpy数组,请使用以下语法。

np.full((rows,cols),np.nan)

例子。

在下面的代码段中,让我们创建一个充满Nan值的3*3数组。

import numpy as np

arr=np.full((3,3),np.nan)
print(arr)

输出。

[[nan nan nan]
 [nan nan nan]
 [nan nan nan]]

方法2:使用numpy.fill()

你可以创建一个空数组,然后用 numpy.fill().

虽然有很多方法可以创建一个空数组,但让我们使用最简单的方法,numpy.empty()

要创建一个空的NumPy数组,其行数为rows ,列数为cols ,并填入NaN值,请使用以下方法。

np.empty((rows,columns))    # create an empty array of (n,m) shape
np.fill(np.nan)             # fill the array with Nan values

假设你想创建一个大小为3*3的Nan数组,并在其中填充NaN数组。

import numpy as np

arr=np.empty((3,3))     #Create an empty array
arr.fill(np.NaN)        #Fill the array with Nan values
print(arr)

输出。

[[nan nan nan]
 [nan nan nan]
 [nan nan nan]]

方法3:使用arr[:]来填充NaN值

在创建一个空数组后,代替numpy.fill() ,你也可以使用数组切片来指定NaN值。

为了给整个数组指定NaN值,使用下面的语句。

arr[:] = np.nan 

首先,创建一个所需形状的空数组,然后如图所示给它指定NaN值。

import numpy as np

arr=np.empty((3,3))
arr[:]=np.nan
print(arr)

输出。

[[nan nan nan]
 [nan nan nan]
 [nan nan nan]]

方法4:使用numpy.tile()

Numpy允许我们通过重复一个元素n 的次数来构造一个数组,使用 [numpy.tile()](http://tile).

要构建一个NaN数组,其行数为rows ,列数为cols

np.tile(np.nan, (rows, cols))

例如,要构建一个大小为3*3的数组,并在其中填入NaN值,请使用以下方法。

import numpy as np

arr=np.tile(np.nan,(3,3))
print(arr)

输出。

[[nan nan nan]
 [nan nan nan]
 [nan nan nan]]

方法5:使用numpy.repeat()

你可以创建一个NaN数组并重复所需的次数。

要创建一个具有rows 行数和cols 列数的NaN数组,使用 [numpy.repeat()](https://numpy.org/doc/stable/reference/generated/numpy.repeat.html#numpy.repeat)方法,如下所示。

np.repeat([[np.nan]]*rows, cols, axis=1)

假设你想创建一个2行3列的数组,你可以运行下面的代码片断。

import numpy as np

arr=np.repeat([[np.nan]]*2,3,axis=1)
print(arr)

输出。

[[nan nan nan]
 [nan nan nan]]

方法6:使用numpy.ones() * Nan

试图记住NumPy方法的名称可能会让人不知所措。如果是这样的话,你可以用one创建一个NumPy数组,并与NaN值相乘。

首先,创建一个形状(rows,cols) 的数组,其中装入1,使用 [numpy.ones()](https://numpy.org/doc/stable/reference/generated/numpy.ones.html)方法创建一个装满1的数组。然后将该数组与NaN值相乘,如下图所示。

np.ones((rows,cols))* np.nan

如果你想创建一个3*3的Nan数组,请尝试以下方法。

import numpy as np

arr=np.ones((3,3))* np.nan
print(arr)

输出。

[[nan nan nan]
 [nan nan nan]
 [nan nan nan]]

方法7:乘以列表

用NaNn值创建一个列表,并使用np.array() 方法将其转换为NumPy数组。

要创建一个行数和列数为rows 的Nan数组,请使用以下方法。cols 列的Nan数组,请使用以下方法。

arr = np.array(cols * [rows*[np.nan]])

例如,如果你想创建一个2行3列的NaN数组,请使用下面的代码片断。

import numpy as np

arr = np.array(3 * [2*[np.nan]])
print(arr)

输出。

[[nan nan]
 [nan nan]
 [nan nan]]

执行时间和运行时间比较

现在我们已经看到了创建一个空NaN数组的不同方法,让我们来确定上述所有方法的执行时间(纳秒)。

要创建一个大小为3*3的NaN数组,让我们看看每种方法要花多少时间。让我们使用perf_counter_ns ,从 [time](https://blog.finxter.com/a-gentle-introduction-to-pythons-time-module/)模块来确定执行时间。

import numpy as np
from time import perf_counter_ns

#Using np.fill()
start=perf_counter_ns()
arr=np.empty((3,3))     #create an empty array
arr.fill(np.NaN)        #Fill the array with Nan values
end=perf_counter_ns()
print("Execution Time using fill   : %5dns"%(end-start))

#Using the slicing(colon)
start=perf_counter_ns()
arr_colon=np.empty((3,3))
arr_colon[:]=np.nan
end=perf_counter_ns()
print("Execution Time using colon  : %5dns"%(end-start))

#Using the np.full()
start=perf_counter_ns()
arr_full=np.full((3,3),np.nan)
end=perf_counter_ns()
print("Execution Time using full   : %5dns"%(end-start))

#Using np.tile()
start=perf_counter_ns()
arr_tile=np.tile(np.nan,(3,3))
end=perf_counter_ns()
print("Execution Time using tile   : %5dns"%(end-start))

#Using np.repeat()
start=perf_counter_ns()
arr_repeat=np.repeat([[np.nan]]*3,3,axis=1)
end=perf_counter_ns()
print("Execution Time using repeat : %5dns"%(end-start))


#Using np.ones*np.nan
start=perf_counter_ns()
arr_ones=np.ones((3,3))* np.nan
end=perf_counter_ns()
print("Execution Time using ones   : %5dns"%(end-start))

#Using list
start=perf_counter_ns()
arr_list = np.array(3 * [3*[np.nan]])
end=perf_counter_ns()
print("Execution Time using list   : %5dns"%(end-start))

输出。

Execution Time using fill   :  4100ns
Execution Time using colon  :  2700ns
Execution Time using full   :  4600ns
Execution Time using tile   : 18500ns
Execution Time using repeat :  9700ns
Execution Time using ones   :  8000ns
Execution Time using list   :  2300ns

结论

这使我们来到了本文的结尾。

在这篇文章中,我们已经发现了创建一个有NaN值的numpy数组的各种方法。