2015-03-31 141 views
2

我有一个二进制数据的二维numpy数组,即0和1(未观察到或观察到)。对于某些情况,缺少该信息(NaN)。由于缺失值在数据集中是随机的,我认为最好的替换方法是使用随机的0和1。在numpy数组中随机替换缺失值

下面是一些示例代码:

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

回答

2

尝试

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

我认为它应该是'np.random.randint(0,** 2 **,大小= NP。 count_nonzero(nan_mask))',不是吗?否则,我似乎只得到0。顺便说一句好主意!我自己应该想到这一点,因为我已经在使用尺寸规格的'np.random.randit()'... – 2015-03-31 11:43:25

+1

没错,你是对的,修好了! – YXD 2015-03-31 12:06:26

2

您可以使用矢量功能:

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

谢谢!我从来没有真正掌握矢量化函数,我很少使用它们。虽然这很清楚。尽管如此,我更喜欢E先生的解决方案E. – 2015-03-31 11:45:27

+0

@ Lilith-Elina没问题,我认为他们也更好。 – MJeffryes 2015-03-31 11:55:35

2

由于缺失值是数据集中随机的,我想,以取代他们会用最好的方式随机0和1。

我在这里真诚地反驳你。除非你有随机模型,证明假定每个元素的概率等于0或1,那么这会偏向你的观察。

现在,我不知道您的数据来自何处,但“2D阵列”确实听起来像是图像信号,或类似的东西。你可以发现许多信号类型的大部分能量都是低频率的;如果您遇到类似情况,您可以通过用二维数组的低通滤波版本元素替换缺失值来减小失真。无论哪种方式,因为你需要从python调用numpy.isnan来检查一个值是否为NaN,我认为解决这个问题的唯一方法是编写一个高效的循环,除非你想毫无意义地计算一个巨大的随机二维数组,填写一些缺失的数字。

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

EDIT2:与计数非零元素的掩模的方法是更有效的,我想:)

+0

我的数据是在不同测序样品中有或没有的突变。由于某些地方某些样品的测序不够深,所以缺失了数值。这似乎或多或少是随机的,所以我认为多次进行随机替换,比较结果将比例如更优雅。取代0.5或输入手段(工作,但没有太大的意义,二进制数据,是吗?)。 – 2015-03-31 10:00:32

+1

除非你是量子物理学家,否则它可能不会真的,我很高兴听到你对数据有深入的理解;通常人们通过发明可能严重破坏他们对SO的观察的东西来修正他们的数据(因为程序员不一定是好理论),所以我认为你应该对其他答案保持良好。感谢您的好评! – 2015-03-31 10:02:20

+0

我既不是“真正的”程序员,也不是数学家/统计学家/任何人,所以我仍然对这些事情有困难。我只是尽量从逻辑上考虑问题,并尝试看起来最有意义的东西。 ;-)所以,感谢给我一些关于我的推理的反馈,而不仅仅是代码。 – 2015-03-31 11:38:13