2011-05-06 40 views
6

我有一個結構化的陣列,例如:NumPy的:以編程方式修改D型結構化陣列

import numpy as np 
orig_type = np.dtype([('Col1', '<u4'), ('Col2', '<i4'), ('Col3', '<f8')]) 
sa = np.empty(4, dtype=orig_type) 

其中sa樣子(隨機數據):

array([(11772880L, 14527168, 1.079593371731406e-307), 
     (14528064L, 21648608, 1.9202565460908188e-302), 
     (21651072L, 21647712, 1.113579933986867e-305), 
     (10374784L, 1918987381, 3.4871913811200906e-304)], 
     dtype=[('Col1', '<u4'), ('Col2', '<i4'), ('Col3', '<f8')]) 

現在,在我的程序,我以某種方式決定我需要將'Col2'的數據類型更改爲一個字符串。我怎樣才能修改dtype要做到這一點,例如非編程的方法:

new_type = np.dtype([('Col1', '<u4'), ('Col2', '|S10'), ('Col3', '<f8')]) 
new_sa = sa.astype(new_type) 

其中new_sa現在看起來,這是偉大的:

array([(11772880L, '14527168', 1.079593371731406e-307), 
     (14528064L, '21648608', 1.9202565460908188e-302), 
     (21651072L, '21647712', 1.113579933986867e-305), 
     (10374784L, '1918987381', 3.4871913811200906e-304)], 
     dtype=[('Col1', '<u4'), ('Col2', '|S10'), ('Col3', '<f8')]) 

如何編程修改orig_typenew_type ? (不用擔心長度爲|S10)。有沒有「簡單」的方法,還是我需要一個for循環來構造一個新的構造函數對象?

回答

4

如果你的問題其實目的是如何從舊建新dtype對象,這可能是你在找什麼:

orig_type = sa.dtype 
descr = orig_type.descr 
descr[1] = (descr[1][0], "|S10") 
new_type = numpy.dtype(descr) 
+0

'.descr'就是我一直在尋找,謝謝! – 2011-05-07 05:16:45

5

沒有捷徑。您只需構建新的dtype,然後使用.astype()即可。