2009-10-21 83 views
6

是否有一種簡單的方法將記錄/行添加到numpy recarray而不創建新的數組?假設我有一個需要1Gb內存的recarray,我希望能夠在沒有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 - 然後您可以修復它們,如Travis Oliphant在那裏提到的那樣,通過添加refcheck = 0的參數(除非你已經共享了數據,在這種情況下,不能再調整大小)(請注意,Travis提到的SVN頭部特徵是numpy的定期發佈的numpy的一部分現在很長一段時間 - 那個線程已經超過3年了;-)。 –

+0

謝謝!a.resize(3,refcheck = 0)爲我做了這個訣竅。 – unutbu