【问题标题】:Numpy broadcast_to for masked array用于掩码数组的 Numpy broadcast_to
【发布时间】:2017-11-23 10:21:25
【问题描述】:

我正在使用np.broadcast_to 函数来获取重构数组的视图,就像示例一样:

>>> x = np.array([1, 2, 3])
>>> np.broadcast_to(x, (3, 3))
array([[1, 2, 3],
       [1, 2, 3],
       [1, 2, 3]])

将一个掩码数组传递给这个函数会让我失去掩码:

>>> y = np.ma.array([1, 2, 3], mask=[False, True, False])
>>> np.broadcast_to(y, (3, 3))
array([[1, 2, 3],
       [1, 2, 3],
       [1, 2, 3]])

如何获得以下视图?

array([[1, --, 3],
       [1, --, 3],
       [1, --, 3]])

【问题讨论】:

  • -- 不是有效的 Numpy 或 Python 标识符。 -- 应该是什么?没有?
  • @Kasramvd -- 用于掩码数组的掩码项的显示。
  • 我预计在 np.broadcast_to 中传递 subok=True 会返回您想要的结果,但不幸的是,它没有。掩码未广播。
  • 作为一般规则,numpy 函数不“知道”掩码数组。他们倾向于只使用data 部分。 np.ma 函数和将任务委托给掩码方法的函数一样。

标签: python numpy masked-array


【解决方案1】:

显然,您可以将subok 参数传递给np.broadcast_to 以保留传递的数组的类型而不使用基数组类型,但这只会广播屏蔽数组的数据,而不是掩码。

之后您可能应该手动广播掩码:

>>> y = np.ma.array([1, 2, 3], mask=[False, True, False])
>>> z = np.broadcast_to(y, (3, 3), subok=True)
>>> z.mask
False
>>> z.mask = np.broadcast_to(y.mask, z.shape)
>>> z
masked_array(data =
 [[1 -- 3]
 [1 -- 3]
 [1 -- 3]],
             mask =
 [[False  True False]
 [False  True False]
 [False  True False]],
       fill_value = 999999)

【讨论】:

    【解决方案2】:

    我想这就是你想要的。广播后屏蔽数组,这样就得到想要的屏蔽数组了。

    y = np.ma.array([1, 2, 3])
    z = np.broadcast_to(y, (3, 3))
    x = np.ma.array(z, mask=np.broadcast_to([False,True,False], (3, 3)))
    x
    masked_array(data =
     [[1 -- 3]
     [1 -- 3]
     [1 -- 3]],
                 mask =
     [[False  True False]
     [False  True False]
     [False  True False]],
           fill_value = 999999)
    

    检查这是否适用于您的情况。 如果你想要没有'--'的掩码数组值

    x.compressed()
    array([1, 3, 1, 3, 1, 3])
    

    更多信息请通过Masked array documentation

    【讨论】:

    • 是的,应该可以。我可以通过y.mask 而不是[0,1,0] 使其更通用。 copy 参数在 `np.ma.array' 函数中也默认为 False,因此它应该返回一个视图。谢谢
    • 欢迎您! @DuncanWP
    【解决方案3】:

    基于@Sandeep Kadapa 的有益结果(我缺乏评论的声誉), 我构建了一个函数,可以用来查找和替换 numpy.broadcast_to 的调用:

    import numpy as np
    
    def ma_broadcast_to(maskedarray,tup):
            initial_mask=np.ma.getmask(maskedarray)
            broadcasted_mask=np.broadcast_to(initial_mask,tup)
            broadcasted_array=np.broadcast_to(maskedarray,tup)
            return np.ma.array(broadcasted_array, mask=broadcasted_mask)
    

    并应用于 OP

    y = np.ma.array([1, 2, 3], mask=[False, True, False])
    ma_broadcast_to(y,(3,3))
    

    返回

    masked_array(
      data=[[1, --, 3],
            [1, --, 3],
            [1, --, 3]],
      mask=[[False,  True, False],
            [False,  True, False],
            [False,  True, False]],
      fill_value=999999)
    

    【讨论】:

      猜你喜欢
      • 2021-06-24
      • 1970-01-01
      • 1970-01-01
      • 2019-10-12
      • 1970-01-01
      • 2014-03-03
      • 1970-01-01
      • 2012-01-28
      相关资源
      最近更新 更多