2015-03-31 137 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