Python 屏蔽阵列的Numpy广播_to

Python 屏蔽阵列的Numpy广播_to,python,numpy,masked-array,Python,Numpy,Masked Array,我正在使用np.broadcast\u 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, Tru

我正在使用
np.broadcast\u 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)
检查这是否适用于您的案例。 如果希望掩码数组值不带“---”


要了解更多信息,请浏览,显然,您可以将
subok
参数传递到
np.broadcast\u 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)

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

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)

--
不是有效的Numpy或Python标识符。
--
应该是什么?无?@Kasramvd
--
用于显示屏蔽数组的屏蔽项。我希望在
np.broadcast\u
中传递
subok=True
,以返回所需的结果,但不幸的是,它没有。掩码不会被广播。通常,numpy函数不“知道”掩码数组。他们倾向于只使用
数据
部分
np.ma
函数可以工作,将任务委托给屏蔽方法的函数也可以工作。是的,应该可以工作。我可以传递
y.mask
而不是
[0,1,0]
,使其更通用。在'np.ma.array'函数中,
copy
参数也默认为
False
,因此它应该返回一个视图。谢谢,欢迎光临@邓肯
masked_array(
  data=[[1, --, 3],
        [1, --, 3],
        [1, --, 3]],
  mask=[[False,  True, False],
        [False,  True, False],
        [False,  True, False]],
  fill_value=999999)