【问题标题】:Create sample numpy array with randomly placed NaNs使用随机放置的 NaN 创建示例 numpy 数组
【发布时间】:2015-11-17 21:11:34
【问题描述】:

出于测试目的,我想创建一个 M by N numpy 数组,其中 c 随机放置 NaN

import numpy as np

M = 10;
N = 5;
c = 15;
A = np.random.randn(M,N)

A[mask] = np.nan

我在创建带有c 真实元素的mask 时遇到问题,或者这可以直接使用索引来完成?

【问题讨论】:

    标签: python arrays numpy nan


    【解决方案1】:

    您可以将np.random.choice 与可选的replace=False 一起用于random selection without replacement,并将它们用于A 的扁平版本(使用.ravel() 完成),就像这样-

    A.ravel()[np.random.choice(A.size, c, replace=False)] = np.nan
    

    示例运行 -

    In [100]: A
    Out[100]: 
    array([[-0.35365726,  0.26754527, -0.44985524, -1.29520237,  2.01505444],
           [ 0.01319146,  0.65150356, -2.32054478,  0.40924753,  0.24761671],
           [ 0.3014714 , -0.80688589, -2.61431163,  0.07787956,  1.23381951],
           [-1.70725777,  0.07856845, -1.04354202, -0.68904925,  1.07161002],
           [-1.08061614,  1.17728247, -1.5913516 , -1.87601976,  1.14655867],
           [ 1.12542853, -0.26290025, -1.0371326 ,  0.53019033, -1.20766258],
           [ 1.00692277,  0.171661  , -0.89646634,  1.87619114, -1.04900026],
           [ 0.22238353, -0.6523747 , -0.38951426,  0.78449948, -1.14698869],
           [ 0.58023183,  1.99987331, -0.85938155,  1.4211672 , -0.43369898],
           [-2.15682219, -0.6872121 , -1.28073816, -0.97523148, -2.27967001]])
    
    In [101]: A.ravel()[np.random.choice(A.size, c, replace=False)] = np.nan
    
    In [102]: A
    Out[102]: 
    array([[        nan,  0.26754527, -0.44985524,         nan,  2.01505444],
           [ 0.01319146,  0.65150356, -2.32054478,         nan,  0.24761671],
           [        nan, -0.80688589,         nan,         nan,  1.23381951],
           [        nan,         nan, -1.04354202, -0.68904925,  1.07161002],
           [-1.08061614,  1.17728247, -1.5913516 ,         nan,  1.14655867],
           [ 1.12542853,         nan, -1.0371326 ,  0.53019033, -1.20766258],
           [        nan,  0.171661  , -0.89646634,         nan,         nan],
           [ 0.22238353, -0.6523747 , -0.38951426,  0.78449948, -1.14698869],
           [ 0.58023183,  1.99987331, -0.85938155,         nan, -0.43369898],
           [-2.15682219, -0.6872121 , -1.28073816, -0.97523148,         nan]])
    

    【讨论】:

    • 哦,这比我的方式优雅一点!
    • 我想我也可以用np.random.randint(0,high=A.size,size=c) 替换我的应用程序的np.random.choice(如果替换并不重要)。但是,为什么数组在ravel() 之后没有保持平坦?
    • @OlegKomarov np.random.randint 可能会给您重复索引,所以我认为这不适用于您的情况。关于.ravel() 的事情,它只是view,所以它在内存中并没有完全变平。因此,“扁平视图”被索引并设置为 NaN,同时被保存为 2D 数组。
    • 谢谢,我正在阅读文档 :)。作为最后的好奇,ravel() 的文档说A copy is made only if needed.。我会得到一个扁平化的A吗?
    • @OlegKomarov 如果您只是索引它,它必须保持为二维数组。您也可以使用np.put 获得相同的效果。所以,它的解决方案是np.put(A,np.random.choice(A.size, c, replace=False),np.nan)
    【解决方案2】:

    您可以在新数组上使用np.random.shuffle 来创建您的掩码:

    import numpy as np
    
    M = 10;
    N = 5;
    c = 15;
    A = np.random.randn(M,N)
    
    mask=np.zeros(M*N,dtype=bool)
    mask[:c] = True
    np.random.shuffle(mask)
    mask=mask.reshape(M,N)
    
    A[mask] = np.nan
    

    这给出了:

    [[ 0.98244168  0.72121195  0.99291217  0.17035834  0.46987918]
     [ 0.76919975  0.53102064         nan  0.78776918         nan]
     [ 0.50931304  0.91826809  0.52717345         nan         nan]
     [ 0.35445471  0.28048106  0.91922292  0.76091783  0.43256409]
     [ 0.69981284  0.0620876   0.92502572         nan         nan]
     [        nan         nan         nan  0.24466688  0.70259211]
     [ 0.4916004          nan         nan  0.94945378  0.73983538]
     [ 0.89057404  0.4542628          nan  0.95547377         nan]
     [ 0.4071912   0.36066797  0.73169132  0.48217226  0.62607888]
     [ 0.30341337         nan  0.75608859  0.31497997         nan]]
    

    【讨论】:

    • 你的也不错!我不得不谷歌搜索随机选择而不替换,发现random_choice 有那个可选的replace 参数,刚刚工作! :)
    猜你喜欢
    • 2014-02-19
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 2014-04-21
    • 2019-09-22
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多