【问题标题】:How to create masked array with a vector that separates sections of a 2d array?如何使用分隔二维数组部分的向量创建掩码数组?
【发布时间】:2016-06-15 10:13:35
【问题描述】:

假设我有一个标准的 2d numpy 数组,我们称它为带有值的 my2darray。在这个数组中有两个主要部分。假设对于每一列,有一个特定的行将“scenario1”和“scenario2”分开。我如何创建 2 个掩码数组来表示 my2darray 的顶部和 my2darray 的底部。例如,我有兴趣计算上半部分的平均值和下半部分的平均值。一个想法是有一个与 my2darray 形状相同的掩码,但这似乎是对内存的浪费。有更好的主意吗?假设我有一个向量,其中长度等于 my2darray 中的行数(在本例中为 6),即我有

myvector=np.array([9, 15, 5,7,11,11])

我正在使用 python 2.6 和 numpy 1.5.0

【问题讨论】:

    标签: python numpy masked-array


    【解决方案1】:

    使用NumPy's broadcasted comparison,我们可以以矢量化的方式创建这样一个2D 掩码。其余的工作都是关于沿第一轴的sum-reduction,我们可以从np.einsum 那里获得帮助。因此,我们会有这样的实现 -

    N = my2darray.shape[0]
    mask = myvector <= np.arange(N)[:,None]
    uout = np.true_divide(np.einsum('ij,ij->j',my2darray,~mask),myvector)
    lout = np.true_divide(np.einsum('ij,ij->j',my2darray,mask),N-myvector)
    

    运行示例以验证结果 -

    In [184]: N = my2darray.shape[0]
         ...: mask = myvector <= np.arange(N)[:,None]
         ...: uout = np.true_divide(np.einsum('ij,ij->j',my2darray,~mask),myvector)
         ...: lout = np.true_divide(np.einsum('ij,ij->j',my2darray,mask),N-myvector)
         ...: 
    
    In [185]: uout
    Out[185]: array([ 6. ,  4.6,  4. ,  0. ])
    
    In [186]: [my2darray[:item,i].mean() for i,item in enumerate(myvector)]
    Out[186]: [6.0, 4.5999999999999996, 4.0, 0.0] # Loopy version results
    
    In [187]: lout
    Out[187]: array([ 5.2       ,  4.        ,  2.66666667,  2.        ])
    
    In [188]: [my2darray[item:,i].mean() for i,item in enumerate(myvector)]
    Out[188]: [5.2000000000000002, 4.0, 2.6666666666666665, 2.0] # Loopy version
    

    另一种可能更快的方法是计算上掩码的总和,将其存储并从中减去沿2D 输入数组整个长度的第一个轴的总和。然后可以将其用于计算下部平均值。因此,在我们存储N 并计算mask 之后,我们将有 -

    usum = np.einsum('ij,ij->j',my2darray,~mask)
    uout = np.true_divide(usums,myvector)
    lout = np.true_divide(my2darray.sum(0) - usums,N-myvector)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-11
      • 2021-12-27
      • 2013-01-08
      相关资源
      最近更新 更多