рваный массив - PullRequest
       4

рваный массив

0 голосов
/ 28 сентября 2018

Я хочу заполнить замаскированный массив, dtype которого является объектом (потому что мне нужно хранить замаскированные рваные массивы), не скалярным fill_value.

Вот пример 2D-массива, элементы которого являются 1D-массивами.Конечно, я хотел бы, чтобы 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)

Я мог бы вручную извлечь маску,и применить его к поэлементному алгоритму;но мне кажется, это неправильное направление.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Я бы не рассчитывал на 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)
0 голосов
/ 28 сентября 2018

Функция «заполнено» снабжена значением для маскируемой детали.

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) 

Эта версия кода не дает этой ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...