【问题标题】:python, numpy generate bad datapython, numpy 生成不良数据
【发布时间】:2018-10-12 16:44:55
【问题描述】:

我正在尝试撰写有关处理不良数据的不同方法的文章。现在,我正在研究 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])

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

我现在做的方式不太好,我觉得有一种更蟒蛇的方式存在

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)

【问题讨论】:

    标签: python numpy auto-generate


    【解决方案1】:
    mask = np.random.choice([False, True], size=X.shape, p=[0.9, 0.1])
    X[mask] = np.nan
    

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

    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]])
    

    【讨论】:

    • @MohammadAthar 那么你可能没有直接复制他的代码,或者你的数据集不是一个numpy数组。
    • @MohammadAthar 看到编辑,不知道为什么它在那里不起作用
    • @MohammadAthar 如果您必须使用不支持 numpy 样式切片的对象(这些答案中的大多数都依赖于此),但确实支持逐元素乘法,您可以更改 [False, True]在掩码创建中到[1.0, np.nan],然后将分配从X[mask] = np.nan更改为X *= mask
    【解决方案2】:

    你试过了吗:

    mask = np.random.random(size=X.shape)
    X[mask > .9] = None
    

    工作示例:

    x = np.ones((5, 5))
    mask = np.random.random(size=x.shape)
    # array([[ 0.46578606,  0.75331373,  0.05911855,  0.85127777,  0.85549141],
    #        [ 0.20080012,  0.37121033,  0.69645537,  0.76756564,  0.42591026],
    #        [ 0.84719144,  0.17824992,  0.81800073,  0.26026423,  0.89056928],
    #        [ 0.90355276,  0.93950118,  0.62471001,  0.17618564,  0.15952916],
    #        [ 0.08325249,  0.64214048,  0.60089593,  0.94820258,  0.62338702]])
    x[mask > .9] = None
    # array([[  1.,   1.,   1.,   1.,   1.],
    #        [  1.,   1.,   1.,   1.,   1.],
    #        [  1.,   1.,   1.,   1.,   1.],
    #        [ nan,  nan,   1.,   1.,   1.],
    #        [  1.,   1.,   1.,  nan,   1.]])
    

    【讨论】:

    • 我做到了,但是当我这样做的时候就得到了所有的 nan
    • 正如@Aaron 在另一个回复中提到的,您可能误用了此代码。我在答案中添加了一个工作示例来说明。
    • 这行得通。我会踢我的代码,看看我做错了什么。谢谢!
    • @MohammadAthar 我相信像 filippo 那样使用np.nan 可能比None 为您提供更好的服务,因为它是type(np.nan) -&gt; &lt;class 'float'&gt;,所以它会更好地处理您想做的任何数学计算数据。 Numpy 在某些情况下会自动转换(如示例中所示),但通常最好将其写出来。
    • 我同意@Aaron。不过,为了真实性,我选择不编辑我的答案,因为我不确定 OP 使用此代码的最终目标(正如 OP 提到的“处理 Null/None/Nan”,可能是不同的情况)。
    【解决方案3】:

    您可以使用列表推导将其写在一行中:

    X = [ [ xi if mi else None for xi, mi in zip(x,m) ] for x, m in zip(X, mask) ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-04
      • 2021-02-13
      • 2019-04-25
      • 1970-01-01
      • 2016-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多