Я бы не рассчитывал на 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) элементы из fill_value
в result
.
marr.data
и marr.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)
заливка, которая работает
Я могу заставить эту заливку работать, если я определю массив dtype объекта (1,) и поместим массив (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
можно транслировать (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)