2017-04-13 46 views
0

我有一個結構數組是這樣的:numpy的結構化陣列添加記錄

a = np.array([(0. , 1. , 2.) , (10. , 11. , 12.)] , 
      dtype=[('PositionX', '<f8'), ('PositionY', '<f8'), ('PositionZ', '<f8')]) 

現在,我想補充記錄0([0]),並記錄圖1(a [1]),要達到這樣的: (10,12,14)

當我寫的東西,如:

a[0] + a[1] 

我有錯誤,告訴我,你不能添加兩個D型物體或類似的東西。

所以,我想也許我可以把一個[0]變成一個常規矢量,然後執行添加。

但numpy.array(a [0])具有與[0]相同的dtype,並且numpy.array(a[0],dtype=np.float64)也不起作用。

那麼,誰能告訴我如何將[0]轉換爲常規矢量?請不要告訴我隱藏結構化數組到常規數組。因爲我只想取少數陣列記錄並添加。 此外,我真的想知道如何將一個像[0]這樣的對象轉換爲常規矢量。

+1

你嘗試從這個職位的建議 - http://stackoverflow.com/questions/5957380/convert-structured-array-正常的numpy數組?基本上:'a.view(np.float64).reshape(len(a), - 1).sum(0)'。 – Divakar

回答

1

因爲a [i]是元組,所以不能直接添加元組。您有權訪問他們,更Python的方式來實現,這將是:

map(sum, zip(*a)) 

zip函數做的正是你要尋找的,在這之後,你必須根據你的需要來處理每個條目,在你的情況sum,你也可以試試這個:

result = [] 
for elem in zip(*a): 
    result.append(sum(elem)) 
+0

好吧,你的意思是拿每個元組,並在python中創建一個列表,好吧,我可以做到這一點。但我們可以用numpy完成這個嗎?劑量numpy有一些方法可以將dtype轉換爲類似[0]的類型到正常的1d數組? –

+0

如果您試圖將元組轉換爲列表,那麼函數list就是您要查找的內容。 –

0
In [206]: a 
Out[206]: 
array([( 0., 1., 2.), (10., 11., 12.)], 
     dtype=[('PositionX', '<f8'), ('PositionY', '<f8'), ('PositionZ', '<f8')]) 

記錄是一個複合numpy的D類對象,即顯示爲一個元組。

In [207]: type(a[0]) 
Out[207]: numpy.void 
In [208]: a[0].dtype 
Out[208]: dtype([('PositionX', '<f8'), ('PositionY', '<f8'), ('PositionZ', '<f8')]) 

字段陣列的(「列」)是數組,然後執行正常陣列數學。

In [209]: a['PositionX'] 
Out[209]: array([ 0., 10.]) 
In [210]: a['PositionX']+a['PositionY'] 
Out[210]: array([ 1., 21.]) 

但是,數學尚未爲複合D型定義:

In [211]: a[0]+a[1] 
TypeError: ufunc 'add' did not contain a loop with signature matching types dtype([('PositionX', '<f8'), ('PositionY', '<f8'), ('PositionZ', '<f8')]) .... 

如果你讓我轉換整個數組到2d,我可以添加行:

In [213]: a1=np.array(a.tolist()) 
In [214]: a1 
Out[214]: 
array([[ 0., 1., 2.], 
     [ 10., 11., 12.]]) 
In [215]: a1[0]+a1[1] 
Out[215]: array([ 10., 12., 14.]) 

有是將結構化數組轉換爲2d的其他方式(使用viewastype),但此tolist()最易於使用且最一致。更多信息請登錄https://stackoverflow.com/a/43380941/901925

但是要對單個記錄進行數學運算,您必須將它們轉換爲數組或像顯示的元組一樣對待它們。

In [218]: np.array(a[0].tolist()) 
Out[218]: array([ 0., 1., 2.]) 
In [219]: np.array(a[0].tolist())+np.array(a[1].tolist()) 
Out[219]: array([ 10., 12., 14.]) 

但是你對這個數組感到滿意嗎,還是你想要回到a.dtype

In [234]: np.array(tuple(asum), a.dtype) 
Out[234]: 
array((10., 12., 14.), 
     dtype=[('PositionX', '<f8'), ('PositionY', '<f8'), ('PositionZ', '<f8')]) 

數據結構化數組必須在元組或元組列表中。

你,如果你使用壓縮的辦法,@Mohamed Lakhal顯示

In [236]: [i+j for i,j in zip(a[0],a[1])] 
Out[236]: [10.0, 12.0, 14.0] 
In [237]: np.array(tuple([i+j for i,j in zip(a[0],a[1])]), a.dtype) 

雖然view方法,因爲Divakar評論整個數組轉換做同樣的dtype轉換:

In [227]: a.view('<f8') 
Out[227]: array([ 0., 1., 2., 10., 11., 12.]) 
In [228]: a.view('<f8').reshape(-1,3) 
Out[228]: 
array([[ 0., 1., 2.], 
     [ 10., 11., 12.]]) 

它不起作用:

In [229]: a[0].view('<f8') 
.... 
ValueError: new type not compatible with array. 

這是一個更好的轉換器,二維數組:

In [239]: a.view('3f8') 
Out[239]: 
array([[ 0., 1., 2.], 
     [ 10., 11., 12.]]) 
In [240]: a[0].view('3f8') 
Out[240]: array([ 0., 1., 2.]) 
In [241]: a[[0,1]].view('3f8') 
Out[241]: 
array([[ 0., 1., 2.], 
     [ 10., 11., 12.]]) 
In [242]: a[[0,1]].view('3f8').sum(axis=0) 
Out[242]: array([ 10., 12., 14.])