繁体   English   中英

用于屏蔽数组的 Numpy broadcast_to

[英]Numpy broadcast_to for masked array

我正在使用np.broadcast_to函数来查看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]])

显然,您可以将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)

我想这就是你想要的。 广播后对数组进行掩码,以便获得所需的掩码数组。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM