我想用非标量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)
我可以手动提取遮罩,并将其应用于逐个元素的算法;但这似乎不是我的正确方向。
谢谢!
答案 0 :(得分:1)
我不会指望MaskedArray
与对象dtype数组一起工作。 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
尝试相互广播result
,fill_value
和m
(掩码),然后从{{复制相应的(mask == true)元素1}}到fill_value
。
result
和marr.data
均为marr.mask
。但是,将(0,)形状广播为(2,3)无效,而且也不是您想要的。
使用标量填充有效,但不能使用数组(或列表)填充。
(2,3)
一个(1,)形状数组将广播-
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)
但是填充的结果不是数组;这是一个标量:
In [57]: np.broadcast_to(np.array([1]),(2,3))
Out[57]:
array([[1, 1, 1],
[1, 1, 1]])
如果我定义了(1,)对象dtype数组并将(0,)数组放入其中(作为一个对象),则可以使此填充工作。
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)
之所以可行,是因为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)
可以广播到(2,3)而不会弄乱元素的形状
Ofill
这有效,但我不会说它很漂亮(或推荐)。
用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
答案 1 :(得分:0)
已为函数“已填充”提供了要为蒙版零件填充的值。
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)
此版本的代码未显示该错误。