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