【问题标题】:is Numpy's masked array memory efficient?Numpy 的掩码数组内存效率高吗?
【发布时间】:2015-11-08 17:11:29
【问题描述】:

我想知道:numpy 的 masked arrays 是否能够存储可用值的紧凑表示?换句话说,如果我有一个没有设置值的 numpy 数组,它会以可忽略的大小存储在内存中吗?

其实这不是随便问的问题,我正在开发的一个应用程序需要这样的内存优化。

【问题讨论】:

    标签: python numpy matrix scipy linear-algebra


    【解决方案1】:

    没有掩码数组不会更紧凑。

    In [344]: m = np.ma.masked_array([1,2,3,4],[1,0,0,1])
    
    In [345]: m
    Out[345]: 
    masked_array(data = [-- 2 3 --],
                 mask = [ True False False  True],
           fill_value = 999999)
    
    In [346]: m.data
    Out[346]: array([1, 2, 3, 4])
    
    In [347]: m.mask
    Out[347]: array([ True, False, False,  True], dtype=bool)
    

    它包含原始(完整)数组和掩码。掩码可以是标量,也可以是与数据形状相同的布尔数组。

    scipy.sparse 仅存储数组的非零值,但空间节省取决于存储格式和稀疏性。所以你可以用稀疏来模拟你的掩蔽。或者您可以从该表示中获取想法。

    您打算如何处理这些数组?只是访问项目,还是进行计算?

    掩码数组对于大部分是好的数据最有用,但“坏”值的数量适中。例如,偶尔出现故障的现实生活数据系列,或填充到 31 天的每月数据。掩码让您可以将数据保持在矩形排列中,并且仍然可以在不使用掩码的值的情况下计算平均值和总和。

    【讨论】:

    • 我使用它们来存储一些计算,以“记忆”的方式。这意味着,我将仅在严格要求时计算栅格中像元的值,并且永远不会进行冗余计算。这个我已经实现了,如果它也能节省内存,那就更好了。
    • 理论上,您可以使用对象 dtype 数组,其中每个对象都具有这种“记忆”能力。然后用指针填充数组。但这样的数组只不过是列表。
    • 我需要二维数组/矩阵的拓扑来表示二维值,这也是因为我之后应用了一些高斯卷积。但如果 dtype 数组具有快速索引,我可能会考虑它
    猜你喜欢
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    • 2012-09-22
    相关资源
    最近更新 更多