我有一个带有二进制数据的2D numpy数组,即0和1(未观察或观察到)。在某些情况下,缺少该信息(NaN)。由于缺失值在数据集中是随机的,我认为替换它们的最佳方法是使用随机0和1。
以下是一些示例代码:
import numpy as np
row, col = 10, 5
matrix = np.random.randint(2, size=(row,col))
matrix = matrix.astype(float)
matrix[1,2] = np.nan
matrix[5,3] = np.nan
matrix[8,0] = np.nan
matrix[np.isnan(matrix)] = np.random.randint(2)
这个问题是所有NaN都被替换为相同的值,0或1,而我想要两者。是否有一个更简单的解决方案,例如for循环分别调用每个NaN?我正在处理的数据集比这个例子大很多。
答案 0 :(得分:2)
尝试
nan_mask = np.isnan(matrix)
matrix[nan_mask] = np.random.randint(0, 2, size=np.count_nonzero(nan_mask))
答案 1 :(得分:2)
您可以使用矢量化函数:
random_replace = np.vectorize(lambda x: np.random.randint(2) if np.isnan(x) else x)
random_replace(matrix)
答案 2 :(得分:2)
由于缺失值在数据集中是随机的,我认为替换它们的最佳方法是使用随机0和1。
我在这里真诚地反驳你。除非你有随机模型证明假设每个元素的概率相等为0或1,否则会影响你的观察。
现在,我不知道您的数据来自哪里,但是" 2D数组"确实听起来像一个图像信号,或类似的东西。您可以发现许多信号类型中的大部分能量都处于低频;如果您遇到类似情况,则可以通过使用2D数组的低通滤波版本的元素替换缺失值来减少失真。
无论哪种方式,因为你需要从python调用numpy.isnan
来检查一个值是否为NaN,我认为解决这个问题的唯一方法就是编写一个有效的循环,除非你想毫无意义地计算一个巨大的随机2D数组只是为了填补一些缺失的数字。
编辑:哦,我喜欢矢量版;它实际上是我所谓的高效循环,因为它在没有每次解释python循环迭代的情况下进行循环。
EDIT2 :计算非零的掩码方法更有效,我想:)