2009-10-21 20 views
6

¿Existe alguna manera fácil de agregar un registro/fila a una repetición numpy sin crear una nueva versión de recarray? Digamos que tengo una recarray que toma 1Gb en memoria, quiero poder agregarle una fila sin tener que tomar python 2Gb de memoria temporalmente.Agregar row a numpy recarray

Respuesta

10

Puede llamar al yourrecarray.resize con una forma que tiene una fila más, luego asigne a esa nueva fila. Por supuesto. numpyfuerza todavía tiene que asignar completamente nueva memoria si simplemente no tiene espacio para crecer la matriz en el lugar, pero al menos tiene una posibilidad! -)

Desde que se solicitó un ejemplo, aquí viene, modificado fuera del canónico 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

¿Podría mostrar algún código de demostración? Mi intento de llamar a arr.resize() terminó con ValueError: no se puede cambiar el tamaño de esta matriz: no posee sus datos – unutbu

+1

@unutbu, seguro, la respuesta editada para proporcionar un ejemplo simple. Puede encontrarse con problemas discutidos en este hilo: http://aspn.activestate.com/ASPN/Mail/Message/numpy-discussion/3042521 - luego puede solucionarlos, como menciona Travis Oliphant allí, agregando el refcheck = 0 argumento para cambiar el tamaño de la llamada (a menos que HAYA compartido los datos, en cuyo caso no puede haber cambio de tamaño en el lugar más (tenga en cuenta que lo que Travis menciona como una característica del jefe de numpy del SVN ha sido parte del numpy publicado regularmente para desde hace mucho tiempo - ese hilo tiene más de 3 años ;-). –

+0

Gracias! a.resize (3, refcheck = 0) hice el truco para mí. – unutbu