2009-10-21 3 views
6

Есть ли простой способ добавить запись/строку в numpy recarray, не создавая новую повторяемость? Предположим, у меня есть повторная запись, которая занимает 1 Гб в памяти, я хочу иметь возможность добавить к ней строку, не имея на время python 2Gb памяти.Добавление строки в numpy recarray

ответ

10

Вы можете позвонить yourrecarray.resize с формой, которая имеет еще одну строку, а затем назначить эту новую строку. Конечно. numpyмощь еще выделить совершенно новую память, если она просто не имеет возможности для роста массива на месте, но, по крайней мере, у вас есть шанс! -)

Поскольку пример запрашивали, вот, модифицировано от канонического example list ...:

>>> import numpy 
>>> mydescriptor = {'names': ('gender','age','weight'), 'formats': ('S1', 'f4', 'f4')} 
>>> a = numpy.array([('M',64.0,75.0),('F',25.0,60.0)], dtype=mydescriptor) 
>>> print a 
[('M', 64.0, 75.0) ('F', 25.0, 60.0)] 
>>> a.shape 
(2,) 
>>> a.resize(3) 
>>> a.shape 
(3,) 
>>> print a 
[('M', 64.0, 75.0) ('F', 25.0, 60.0) ('', 0.0, 0.0)] 
>>> a[2] = ('X', 17.0, 61.5) 
>>> print a 
[('M', 64.0, 75.0) ('F', 25.0, 60.0) ('X', 17.0, 61.5)] 
+0

Не могли бы вы показать демонстрационный код? Моя попытка вызвать arr.resize() закончилась ValueError: не может изменить размер этого массива: он не владеет своими данными – unutbu

+1

@unutbu, конечно, отредактированный ответ для простого примера. Возможно, вы встречаете вопросы, обсуждаемые в этой теме: http://aspn.activestate.com/ASPN/Mail/Message/numpy-discussion/3042521 - тогда вы можете исправить их, как упоминает Трэвис Олифант, добавив refcheck = 0 для вызова изменения размера (если вы не поделили данные, и в этом случае не может быть никакого изменения размера на месте больше (обратите внимание, что то, что Тревис упоминает как особенность главы SVN numpy, было частью регулярно выпущенного numpy для долгое время - эта нить составляет 3+ года ;-) –

+0

Спасибо! a.resize (3, refcheck = 0) сделал трюк для меня. – unutbu

Смежные вопросы