2014-10-03 58 views
2

假設我有一個帶有各種數字數據類型的NumPy結構化數組。作爲一個基本的例子,將具有各種數字數據類型的結構化數組轉換爲常規數組

my_data = np.array([(17, 182.1), (19, 175.6)], dtype='i2,f4') 

我怎樣才能鑄造成浮動的規則與NumPy陣列呢?

this answer,我知道我可以使用

np.array(my_data.tolist()) 

但顯然它是緩慢的,因爲你「轉換一個有效的填充NumPy的陣列到正規Python列表」。

+0

在上一個問題中,所有的字段都是相同的類型。 – hpaulj 2014-10-03 17:19:56

+0

我寫了一個[快速腳本](https://gist.github.com/anonymous/74487ac64c2f69b781d5)查看30000x3000陣列中哪個答案是最快的,而且他們非常相似 - JohnZwinck's:0.30s,Jaime's :0.41s,hpaulj's:0.46s,Warren Weckesser:0.47s。他們都使用了大約3GB的內存。 – Garrett 2014-10-03 22:41:23

回答

1

你可以用大熊貓很容易做到這一點:

>>> import pandas as pd 
>>> pd.DataFrame(my_data).values 
array([[ 17.  , 182.1000061], 
     [ 19.  , 175.6000061]], dtype=float32) 
1

這裏有一種方法(假設my_data是一維結構數組):

In [26]: my_data 
Out[26]: 
array([(17, 182.10000610351562), (19, 175.60000610351562)], 
     dtype=[('f0', '<i2'), ('f1', '<f4')]) 

In [27]: np.column_stack(my_data[name] for name in my_data.dtype.names) 
Out[27]: 
array([[ 17.  , 182.1000061], 
     [ 19.  , 175.6000061]], dtype=float32) 
1

最明顯的方式運行:

>>> my_data 
array([(17, 182.10000610351562), (19, 175.60000610351562)], 
     dtype=[('f0', '<i2'), ('f1', '<f4')]) 
>>> n = len(my_data.dtype.names) # n == 2 
>>> my_data.astype(','.join(['f4']*n)) 
array([(17.0, 182.10000610351562), (19.0, 175.60000610351562)], 
     dtype=[('f0', '<f4'), ('f1', '<f4')]) 
>>> my_data.astype(','.join(['f4']*n)).view('f4') 
array([ 17.  , 182.1000061, 19.  , 175.6000061], dtype=float32) 
>>> my_data.astype(','.join(['f4']*n)).view('f4').reshape(-1, n) 
array([[ 17.  , 182.1000061], 
     [ 19.  , 175.6000061]], dtype=float32) 
0

沃倫答案的一個變種(按字段複製數據):

x = np.empty((my_data.shape[0],len(my_data.dtype)),dtype='f4') 
for i,n in enumerate(my_data.dtype.names): 
    x[:,i]=my_data[n] 

或者你可以按行迭代。 r是一個元組。它必須被轉換成一個列表才能填充一行x。有很多行和幾個字段,這會變慢。

for i,r in enumerate(my_data): 
    x[i,:]=list(r) 

這可能是有益的嘗試x.data=r.data,並得到一個錯誤:AttributeError: not enough data for array。數據是一個帶有4個浮點數的緩衝區。 my_data是一個包含2個元組的緩衝區,每個元組包含一個int和一個float(或[int float int float]的序列)。 my_data.itemsize==6。無論如何,my_data必須轉換爲所有浮點數,並且刪除了元組分組。

但使用astype作爲海梅顯示沒有問題:

x.data=my_data.astype('f4,f4').data 

在使用1000項陣列5場快速測試,通過現場複製領域是一樣快,使用astype

相關問題