NaN代表 不是一个数字.它是一个占位符,表示没有价值。人们可以把它看作是None 或0 。只是None 或0 属于一个特定的类型。然而,NaN却不是。
我们用NaN来表示缺失的数据或无法执行某些操作。在进行复杂的计算时,如果用户试图做一个不可能的任务(例如,对一个负值进行对数计算),并不是抛出一个错误并使程序崩溃,而是返回NaN 。
NumPy将NaN 定义为一个常量值。要在你的程序中使用它,请使用 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数组的各种方法。