2013-01-07 123 views
1

我想用現有數組與幾個命名的字段,並創建一個新的數組(或改變它)與一個分層dtype等於原始dtype的字段。也就是說,添加層次結構到numpy結構化數組

newarray = np.array(oldarray, dtype=[('old',oldarray.dtype)]) 

這樣newarray['old']的形狀和結構oldarray

這裏同樣是一個例子:

In [1]: import numpy as np 

In [2]: dt = np.dtype([('name',np.str_,2),('val',np.float_)]) 

In [3]: constants = np.array([('pi',3.14),('e',2.72)],dtype=dt) 

In [4]: constants 
Out[4]: 
array([('pi', 3.14), ('e', 2.72)], 
     dtype=[('name', '|S2'), ('val', '<f8')]) 

In [5]: numbers = constants.astype([('constants',dt)]) 

但是這給了我全部爲零:

In [6]: numbers 
Out[6]: 
array([(('', 0.0),), (('', 0.0),)], 
     dtype=[('constants', [('name', '|S2'), ('val', '<f8')])]) 

如果我嘗試複製副本,我也有同樣的問題:

In [7]: numbers = np.array(constants,dtype=[('constants',dt)]) 

In [8]: numbers 
Out[8]: 
array([(('', 0.0),), (('', 0.0),)], 
     dtype=[('constants', [('name', '|S2'), ('val', '<f8')])]) 

另外:有誰知道爲什麼這種情況發生?

回答

2

你可以把原來的陣列的view與新的D型(http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.view.html):

>>> import numpy as np 
>>> dt = np.dtype([('name',np.str_,2),('val',np.float_)]) 
>>> constants = np.array([('pi',3.14),('e',2.72)],dtype=dt) 
>>> 
>>> numbers = constants.view([('constants',dt)]) 
>>> 
>>> numbers['constants'] 
array([('pi', 3.14), ('e', 2.72)], 
     dtype=[('name', '|S2'), ('val', '<f8')]) 

請注意,生成的數組numbers是原始數組的視圖,因此其中一個數組中的更改也會影響另一個數組。

+0

謝謝@joris,這是完美的。使用視圖,我實際上可以通過這樣做來改變數組:'constants = constants.view([('constants',dt)])' – askewchan

0

我可以通過使原始數組列表解決的問題:

In [9]: numbers = np.array([constants],dtype=[('constants',dt)]) 

In [10]: numbers 
Out[10]: 
array([[(('pi', 3.14),), (('e', 2.72),)]], 
     dtype=[('constants', [('name', '|S2'), ('val', '<f8')])]) 

但是,當我看着它,我當然列表中的一個額外的嵌套:

In [11]: numbers['constants'] 
Out[11]: 
array([[('pi', 3.14), ('e', 2.72)]], 
     dtype=[('name', '|S2'), ('val', '<f8')]) 

In [12]: numbers['constants']['name'] 
Out[12]: 
array([['pi', 'e']], 
     dtype='|S2') 

我真的只想要列表中的第一項:

In [13]: numbers[0] 
Out[13]: 
array([(('pi', 3.14),), (('e', 2.72),)], 
     dtype=[('constants', [('name', '|S2'), ('val', '<f8')])]) 

我也可以通過展平數組af terward:

In [14]: numbers.flatten() 
Out[14]: 
array([(('pi', 3.14),), (('e', 2.72),)], 
     dtype=[('constants', [('name', '|S2'), ('val', '<f8')])]) 

In [15]: numbers.flatten()['constants'] 
Out[15]: 
array([('pi', 3.14), ('e', 2.72)], 
     dtype=[('name', '|S2'), ('val', '<f8')]) 

In [16]: numbers.flatten()['constants']['name'] 
Out[16]: 
array(['pi', 'e'], 
     dtype='|S2') 

但是,這不是一個黑客?我最終想要的是這個陣列:

In [17]: numbers = np.array([(('pi', 3.14),), (('e', 2.72),)],dtype=[('constants',dt)]) 

In [18]: numbers['constants'] 
Out[18]: 
array([('pi', 3.14), ('e', 2.72)], 
     dtype=[('name', '|S2'), ('val', '<f8')]) 

In [19]: numbers['constants']['name'] 
Out[19]: 
array(['pi', 'e'], 
     dtype='|S2') 

不需要製作一個項目列表,然後將其扁平化。任何更好的想法?