Numpy broadcast_to 用于屏蔽数组

Numpy broadcast_to for masked array

我正在使用 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]])

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

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

显然,你可以向np.broadcast_to传递一个subok参数来保留传递的数组类型而不使用基本数组类型,但这只会广播屏蔽数组的数据,不是面具。

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

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

基于@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))

returns

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