【问题标题】:How do I keep the mask when slicing a masked array in Numpy?在 Numpy 中切片蒙版数组时如何保留蒙版?
【发布时间】:2023-04-03 20:38:01
【问题描述】:

当我创建一个 Numpy 掩码数组的视图(通过切片)时,掩码会复制到视图中——因此对视图的更新不会更改原始掩码(但会更改原始数组中的数据)。

我想要的是在更新视图时同时更改原始数据原始掩码。

来自Numpy documentation

访问切片时,输出是一个掩码数组,其数据属性 是原始数据的视图,其掩码为 nomask(如果有 原始数组中没有无效条目)或 原始掩码的相应切片。副本需要避免 将掩码的任何修改传播到原始版本。

示例

import numpy.ma as ma

orig_arr = ma.array([[11,12],[21,22]])
orig_arr[1,:] = ma.masked

print orig_arr
## Prints: [[11 12]
##          [-- --]]

view_arr = orig_arr[1,:]
print view_arr
## Prints: [-- --]

view_arr[:] = [31,32]
print view_arr
## Prints: [31 32]

print orig_arr
## Prints: [[11 12]
##          [-- --]]
print orig_arr.data[1,:]
## Prints: [31 32]

如您所见,原始数组中的数据已更新,但是 面具没有。

如何使视图中的更新影响原始数组中的掩码?

【问题讨论】:

    标签: python numpy masked-array


    【解决方案1】:

    尝试在更改值之前关闭视图中的遮罩

    orig_arr = ma.array([[11,12],[21,22]])
    orig_arr[1,:] = ma.masked
    
    print orig_arr
    ## Prints: [[11 12]
    ##          [-- --]]
    
    view_arr = orig_arr[1,:]
    print view_arr
    ## Prints: [-- --]
    
    view_arr.mask=False # or [True, False] 
    
    
    view_arr[:] = [31,32] 
    print view_arr
    ## Prints: [31 32] #or [-- 32]
    
    print orig_arr
    ## Prints: [[11 12]
    ##          [31 32]] # or [-- 32]
    

    【讨论】:

    • 我对这项工作有点怀疑,但确实如此。但我的测试也显示了一些不可预测的变化/非变化。我必须更多地查看ma 代码才能正确理解其工作原理。
    • 我同意,这似乎有些不一致。
    • 值得记住的是,实际掩码在arr._mask,而arr.mask 是属性,使用.__setmask__ 方法。所以当你做arr.mask=[...]时,会有“魔法”发生。
    • 显然view_arr._mask 最初是view,而view_arr.mask=... 将其更改为[...](保留链接)。但是var_arr[:]=[] 会创建一个新的_mask,从而断开链接。因此,在您修改 view 之前,视图掩码是一个“惰性”副本,而不是实际副本。我通过查看x._mask.__array_interface__ 对此进行了测试。
    • 这似乎与文档描述的方式相反:这不会在 Numpy 的更高版本中中断吗?非常奇怪的行为——不过感谢您的解决方法! :)
    猜你喜欢
    • 1970-01-01
    • 2019-05-23
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    相关资源
    最近更新 更多