繁体   English   中英

numpy蒙版的衣衫agged的数组

[英]numpy masked ragged array

我想用非标量fill_value填充其dtype为object的蒙版数组(因为我需要存储蒙版的参差不齐的数组)。

这是一个2D数组的示例,其元素是1D numpy数组。 当然,我希望fill_value是一个空数组。

import numpy as np

arr = np.array([
    [np.arange(10), np.arange(5), np.arange(3)],
    [np.arange(1),  np.arange(2), np.array([])],
])

marr = np.ma.array(arr)

marr.mask = [[True, False, False],
             [True, False, True]]
marr.fill_value = np.array([])

marr.filled()

不幸的是,它在最后一行产生了一个错误:

ValueError: could not broadcast input array from shape (0) into shape (2,3)

我可以手动提取遮罩,并将其应用于逐个元素的算法; 但这似乎不是我的正确方向。

谢谢 !

我不会指望MaskedArray与对象dtype数组一起MaskedArray地工作。 filled是试图复制填充值,阵列,进入在所述时隙的子集data 由于广播,即使没有遮罩层也可能很棘手。

查看完整的错误:

In [39]: marr.filled()                                                                                                  
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-39-219e016a84cf> in <module>
----> 1 marr.filled()

/usr/local/lib/python3.6/dist-packages/numpy/ma/core.py in filled(self, fill_value)
   3718             result = self._data.copy('K')
   3719             try:
-> 3720                 np.copyto(result, fill_value, where=m)
   3721             except (TypeError, AttributeError):
   3722                 fill_value = narray(fill_value, dtype=object)

ValueError: could not broadcast input array from shape (0) into shape (2,3)

np.copyto尝试将resultfill_valuem (掩码)相互广播,然后将相应的(mask == true)元素从fill_valueresult

marr.datamarr.mask都是(2,3) 但是,将(0,)形状广播为(2,3)是行不通的,而且也不是您想要的。

用标量填充有效,但不能用数组(或列表)填充。

In [56]: np.broadcast_to(np.array([]),(2,3))                                                                            
...
ValueError: operands could not be broadcast together with remapped shapes [original->remapped]: (0,) and requested shape (2,3)

(1,)形状数组将广播-

In [57]: np.broadcast_to(np.array([1]),(2,3))                                                                           
Out[57]: 
array([[1, 1, 1],
       [1, 1, 1]])

但是,填充的结果不是数组。 它是一个标量:

In [58]: marr.filled(np.array([1]))                                                                                     
Out[58]: 
array([[1, array([0, 1, 2, 3, 4]), array([0, 1, 2])],
       [1, array([0, 1]), 1]], dtype=object)

有效的填充

如果定义(1,)对象dtype数组并将(0,)数组放入其中(作为对象),则可以使此填充工作。

In [97]: Ofill = np.array([None], object)                                                                               
In [98]: Ofill[0] = np.array([])                                                                                        
In [99]: Ofill                                                                                                          
Out[99]: array([array([], dtype=float64)], dtype=object)
In [100]: marr.filled(Ofill)                                                                                            
Out[100]: 
array([[array([], dtype=float64), array([0, 1, 2, 3, 4]),
        array([0, 1, 2])],
       [array([], dtype=float64), array([0, 1]),
        array([], dtype=float64)]], dtype=object)

之所以Ofill ,是因为Ofill可以广播到(2,3)而不会弄乱元素的形状

In [101]: np.broadcast_to(Ofill,(2,3))                                                                                  
Out[101]: 
array([[array([], dtype=float64), array([], dtype=float64),
        array([], dtype=float64)],
       [array([], dtype=float64), array([], dtype=float64),
        array([], dtype=float64)]], dtype=object)

这行得通,但是我不会说它很漂亮(或推荐)。

None填充更漂亮,但是即使如此,我们也必须将其列出:

In [103]: marr.filled([None])                                                                                           
Out[103]: 
array([[None, array([0, 1, 2, 3, 4]), array([0, 1, 2])],
       [None, array([0, 1]), None]], dtype=object)

已为函数“已填充”提供了要为蒙版零件填充的值。

import numpy as np
arr = np.array([
    [np.arange(10), np.arange(5), np.arange(3)],
    [np.arange(1),  np.arange(2), np.array([])],
])
marr = np.ma.array(arr)
marr.mask = [[True, False, False],
             [True, False, True]]
marr.fill_value = np.array([])
marr.filled(2) 

此版本的代码未给出该错误。

暂无
暂无

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

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