2017-05-18 49 views
1

我需要向numpy rec陣列添加一列數據。我見過很多答案飄在這裏,但他們似乎並不爲僅包含一個排REC陣列工作...將數據列添加到只有一行的numpy rec陣列中

比方說,我有一個REC陣列x

>>> x = np.rec.array([1, 2, 3]) 
>>> print(x) 
rec.array((1, 2, 3), 
     dtype=[('f0', '<i8'), ('f1', '<i8'), ('f2', '<i8')]) 

和我要值4追加到與它自己的字段名稱和數據類型的新列,如

rec.array((1, 2, 3, 4), 
     dtype=[('f0', '<i8'), ('f1', '<i8'), ('f2', '<i8'), ('f3', '<i8')]) 

如果我嘗試使用正常append_fields方法來添加一列;

>>> np.lib.recfunctions.append_fields(x, 'f3', 4, dtypes='<i8', 
usemask=False, asrecarray=True) 

然後我最終結束了

TypeError: len() of unsized object 

事實證明,對於只有一個排REC陣列,len(x)不起作用,而x.size一樣。如果我改用np.hstack(),我得到TypeError: invalid type promotion,如果我嘗試np.c_,我得到一個令人失望的結果

>>> np.c_[x, 4] 
array([[(1, 2, 3), (4, 4, 4)]], 
    dtype=(numpy.record, [('f0', '<i8'), ('f1', '<i8'), ('f2', '<i8')])) 
+0

問題不在於'x'的維度,而是'4'的維度。 'rf.append_fields(x,'f3',[4],usemask = False)' – hpaulj

+0

@hpaulj你真的嘗試過嗎?沒什麼區別。我仍然得到一個'TypeError'。如果numpy函數的源代碼調用'len(x)'和'len(x)'拋出一個錯誤,那麼解決方法就是改變'4'就那麼簡單。 – Anonymous

+1

對不起,我的'x'是'(1,)'。 'x = np.rec.array([(1,2,3)])',我的一般印象是'recfunctions'有問題,並且沒有積極開發。我不止一次推薦直接使用結構化數組。 – hpaulj

回答

2

創建初始陣列,使其具有形狀(1);注意額外的括號:

In [17]: x = np.rec.array([[1, 2, 3]]) 

(如果x是你無法控制這樣的輸入,你可以在append_fields()使用它之前使用x = np.atleast_1d(x)。)

然後確保在append_fields給定的值也是長度爲1的序列:

In [18]: np.lib.recfunctions.append_fields(x, 'f3', [4], dtypes='<i8', 
    ...: usemask=False, asrecarray=True) 
Out[18]: 
rec.array([(1, 2, 3, 4)], 
      dtype=[('f0', '<i8'), ('f1', '<i8'), ('f2', '<i8'), ('f3', '<i8')]) 
+0

謝謝,'np.atleast_1d()'做到了訣竅。我想這將在未來派上用場。 – Anonymous

1

這裏正在做的工作沒有recfunctions的方式:

In [64]: x = np.rec.array((1, 2, 3)) 
In [65]: y=np.zeros(x.shape, dtype=x.dtype.descr+[('f3','<i4')]) 
In [66]: y 
Out[66]: 
array((0, 0, 0, 0), 
     dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4'), ('f3', '<i4')]) 
In [67]: for name in x.dtype.names: y[name] = x[name] 
In [68]: y['f3']=4 
In [69]: y 
Out[69]: 
array((1, 2, 3, 4), 
     dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4'), ('f3', '<i4')]) 

從我在recfunctions中看到的代碼中,我認爲它同樣快。當然,單排速度不是問題。一般來說,這些函數用目標dtype創建一個新的'空白'數組,並按照名稱(可能遞歸)從源到目標複製字段。通常一個數組的記錄比字段多得多,所以字段上的迭代相對來說並不慢。