为了账号安全,请及时绑定邮箱和手机立即绑定

Python numpy中缺失值的奇怪时间

Python numpy中缺失值的奇怪时间

喵喔喔 2022-05-24 14:58:45
我有一个长的 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 npimport sysprint(sys.version)print(sys.version_info)print(f'numpy version {np.__version__}')data = np.random.random(100000)data[data<0.1] = 0data[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] = 0data[data==0] = np.nan%timeit data[wheremiss] = 0data[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)] = 0data[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.nandata[data==0] = np.nan%timeit data[wheremiss] = np.nandata[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.nandata[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% 丢失)。但如果我有更多,事情可能不会那么明显。
查看完整描述

1 回答

?
LEATH

TA贡献1936条经验 获得超7个赞

因为你没有衡量你认为你是什么!您data在进行测试时正在改变您的,并timeit多次运行测试。因此,额外的运行正在更改的数据上运行。当您将值更改为0下一次运行时,isnan您将一无所获,并且分配基本上是无操作的。而当您分配nan它时,会导致在下一次迭代中完成更多工作。

您关于何时使用np.where与将其保留为 s 数组的问题bool有点困难。它将涉及不同数据类型的相对大小(例如bool1 字节、int648 字节)、选择的值的比例、分布与 CPU/内存子系统优化的匹配程度(例如,它们主要在一个块中)与均匀分布),做的相对成本np.where与结果将被重用的次数,以及其他我现在想不到的事情。

对于其他用户,可能值得指出的是RAM 延迟(即速度)比 L1 缓存慢 100 倍以上,因此保持内存访问可预测对于最大化缓存利用率很重要


查看完整回答
反对 回复 2022-05-24
  • 1 回答
  • 0 关注
  • 246 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号