在numpy数组中用随机替换缺失值

Replacing missing values with random in a numpy array

我有一个带有二进制数据的 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 更简单的解决方案?我正在处理的数据集比这个例子大很多。

尝试

nan_mask = np.isnan(matrix)
matrix[nan_mask] = np.random.randint(0, 2, size=np.count_nonzero(nan_mask))

您可以使用矢量化函数:

random_replace = np.vectorize(lambda x: np.random.randint(2) if np.isnan(x) else x)
random_replace(matrix)

Since the missing values are random in the data set, I think the best way to replace them would be using random 0s and 1s.

我在此衷心反驳你。除非你有随机模型证明假设每个元素为 0 或 1 的概率相等,否则这会使你的观察产生偏差。

现在,我不知道您的数据来自何处,但“2D 阵列”听起来确实像图像信号或类似信号。您会发现许多信号类型中的大部分能量都处于低频;如果您遇到类似情况,您可以通过将缺失值替换为二维数组的低通滤波版本的元素来减少失真。

无论哪种方式,因为你需要从 python 调用 numpy.isnan 来检查一个值是否为 NaN,我认为解决这个问题的唯一方法是编写一个有效的循环,除非你想毫无意义地计算一个巨大的随机二维数组只是为了填补一些缺失的数字。

编辑:哦,我喜欢矢量化版本;这实际上就是我所说的 高效循环 ,因为它执行循环时每次都不会解释 python 循环迭代。

EDIT2:我猜,计算非零值的掩码方法更有效:)