Пустой подкласс NumPy Recarray теряет свой тип и добавляет атрибуты в NumPy 1,8

Я пытаюсь реализовать подкласс numy recarray (recsub) и назначить его экземпляры для ndarray dtype 'object' (ndarr). Это работает хорошо, но у меня есть проблема, когда подклассный массив данных создается с пустым массивом. Это код для повторного повторного подкласса:

class recsub(numpy.recarray):
"""subclassed recarray"""

def __new__(cls, *args, **kwargs):

    obj = numpy.recarray.__new__(cls, *args, **kwargs)

    return obj

def __init__(self, *arg, **kwargs):

    self.x = -1

def new_method(self):
    print 'new_method() : fooooooooooooo'

Я создаю ndarray как:

ndarr = numpy.ndarray(5, 'object')

Теперь, если я создаю два экземпляра recsub:

ndarr[0] = recsub(2, [('a','f8')])
ndarr[1] = recsub((), [('a','f8')])

Теперь вот странные вещи, которые происходят. Выход из:

print type(ndarr[0])
print type(ndarr[1])

является:

>>> <class '__main__.recsub'>
>>> <class 'numpy.core.records.record'>

поэтому я не могу получить доступ к ndarr[1].x

Раньше это работало в NumPy 1,7, но не в NumPy 1,8! Таким образом, кажется, что-то не хватает при создании экземпляра массива с shape (), а не (n)

Любое предложение приветствуется,

TNX заранее,

1 ответ

Я получаю аналогичное поведение в Dev 1.9 с более простыми массивами

ndarr = np.ndarray(2,dtype=np.object)
x = np.array([1,2])
ndarr[0] = x
y = np.array(3)
ndarr[1] = y
type(ndarr[0])
# numpy.ndarray
type(ndarr[1])
# numpy.int32
ndarr
# array([array([1, 2]), 3], dtype=object)

Так что массив с формой () вставляется в ndarr как скаляр

Я не знаю, является ли это ошибкой, функцией или предполагаемым следствием некоторого изменения между 1.7 и 1.8. Я думаю, что первое место, чтобы посмотреть, это заметки о выпуске для 1.8.

Эта проблема может иметь отношение: https://github.com/numpy/numpy/issues/1679

array([array([]), array(0, object)])
array([array([], dtype=float64), 0], dtype=object)

с исправлением ошибки https://github.com/numpy/numpy/pull/4109, элементы, которые были сохранены как array возвращаются таким же образом (а не как скаляры).

type(ndarr[1])
# <type 'numpy.ndarray'>
ndarr
# [array([1, 2]) array(3)]
# [array([], dtype=float64) array(0, dtype=object)]
# [array([], dtype=float64) 0]

И пример OP работает как ожидалось.

Другие вопросы по тегам