Skip to main content
 首页 » 编程设计

python, numpy 生成错误数据

2025年05月04日21exmyth

我正在尝试撰写有关处理不良数据的不同方法的文章。现在,我正在研究 Null/None/Nan。

我想将数组中的随机值转换为 Null,然后将其打印出来,或以其他方式对其进行操作。

我将数据创建为

iris = datasets.load_iris() 
X = iris.data 

并且可以制作一个随机的面具

mask = np.random.random(size=X.shape) 
mask = np.array([[True if y< .9 else False for y in x] for x in mask]) 

但我不知道如何将该掩码应用于数据。我想做的是如果 mask 中的相应值是 True,则保留 X 中的值,否则将其转换为 None

我现在做的方式并不漂亮,我觉得存在更 pythonic 的方式

i= 0 
while i < len(X): 
    j=0 
    while j < len(X[i]): 
        X[i][j] = X[i][j] if mask[i][j] else None 
        j=j+1 
    i=i+1 
print(X) 

请您参考如下方法:

mask = np.random.choice([False, True], size=X.shape, p=[0.9, 0.1]) 
X[mask] = np.nan 

如果你想看看它是如何工作的,这里有一个与你的数据集的最小 ipython session

In [1]: import numpy as np 
In [2]: from sklearn import datasets 
In [3]: iris = datasets.load_iris() 
In [4]: X = iris.data[:6] 
In [5]: X 
Out[5]:  
array([[5.1, 3.5, 1.4, 0.2], 
       [4.9, 3. , 1.4, 0.2], 
       [4.7, 3.2, 1.3, 0.2], 
       [4.6, 3.1, 1.5, 0.2], 
       [5. , 3.6, 1.4, 0.2], 
       [5.4, 3.9, 1.7, 0.4]]) 
 
In [6]: mask = np.random.choice([False, True], size=X.shape, p=[0.9, 0.1]) 
In [7]: mask.astype(int) 
Out[7]:  
array([[0, 0, 0, 0], 
       [1, 0, 0, 0], 
       [1, 0, 0, 0], 
       [0, 0, 0, 0], 
       [0, 0, 0, 0], 
       [0, 1, 0, 0]]) 
 
In [8]: X[mask] = np.nan 
In [9]: X 
Out[9]:  
array([[5.1, 3.5, 1.4, 0.2], 
       [nan, 3. , 1.4, 0.2], 
       [nan, 3.2, 1.3, 0.2], 
       [4.6, 3.1, 1.5, 0.2], 
       [5. , 3.6, 1.4, 0.2], 
       [5.4, nan, 1.7, 0.4]])