我有一个长的 1-d numpy 数组,其中有 10% 的缺失值。我想反复将其缺失值(np.nan)更改为其他值。我知道有两种方法可以做到这一点:
data[np.isnan(data)] = 0或功能 np.copyto(data, 0, where=np.isnan(data))
有时我想把零放在那里,其他时候我想恢复nans. 我认为np.isnan重复重新计算函数会很慢,最好保存nans的位置。下面代码的一些计时结果是违反直觉的。
我运行了以下内容:
import numpy as np
import sys
print(sys.version)
print(sys.version_info)
print(f'numpy version {np.__version__}')
data = np.random.random(100000)
data[data<0.1] = 0
data[data==0] = np.nan
%timeit missing = np.isnan(data)
%timeit wheremiss = np.where(np.isnan(data))
missing = np.isnan(data)
wheremiss = np.where(np.isnan(data))
print("Use missing list store 0")
%timeit data[missing] = 0
data[data==0] = np.nan
%timeit data[wheremiss] = 0
data[data==0] = np.nan
%timeit np.copyto(data, 0, where=missing)
print("Use isnan function store 0")
data[data==0] = np.nan
%timeit data[np.isnan(data)] = 0
data[data==0] = np.nan
%timeit np.copyto(data, 0, where=np.isnan(data))
print("Use missing list store np.nan")
data[data==0] = np.nan
%timeit data[missing] = np.nan
data[data==0] = np.nan
%timeit data[wheremiss] = np.nan
data[data==0] = np.nan
%timeit np.copyto(data, np.nan, where=missing)
print("Use isnan function store np.nan")
data[data==0] = np.nan
%timeit data[np.isnan(data)] = np.nan
data[data==0] = np.nan
%timeit np.copyto(data, np.nan, where=np.isnan(data))
所以这是第一个问题。为什么存储 a 的时间np.nan比存储 0 的时间要长近 10 倍?(比较第 6 行和第 7 行与第 11 行和第 12 行)
missing与使用函数重新计算缺失值相比,为什么使用存储的列表需要更长的时间isnan?(比较第 3 行和第 5 行与第 6 行和第 7 行)
这只是出于好奇。我可以看到最快的方法是使用np.where获取索引列表(因为我只有 10% 丢失)。但如果我有更多,事情可能不会那么明显。
LEATH
相关分类