2

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

3 回答 3

4

显然,您可以传递一个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)
于 2017-11-23T10:51:30.067 回答
1

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

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 文档

于 2017-11-23T10:45:26.193 回答
0

基于@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)
于 2020-01-08T14:53:49.057 回答