2013-09-26 150 views
0

我的問題基本上是在this previous question'Q2'中詢問(而未回答)的內容。更改字符串數據的結構化陣列零的dtype

我有一個字符串列和一列整數的結構化數組。我用整數代替字符串,但由於該列的類型不變,整數被記錄爲字符串。我可以將列的dtype更改爲整數,但所有字符串都將轉換爲0,而不是每個字符串中的整數值。如何更改列,使整數值在dtype轉換期間不會丟失?

我創建了一個說明性的例子:

dat = np.array([('1', 3392),('2', 4159),('1', 1093),('1', 9836)], dtype=[('code', 'U24'),('id', 'i2')]) 
dat.astype(dtype=[('code', 'i4'), ('id', 'i2')]) 

但對於原因,我不明白,這實際工作,得到以下特性:

array([(1, 3392), (2, 4159), (1, 1093), (1, 9836)], 
    dtype=[('code', '<i4'), ('id', '<i2')]) 

這就是我想要的!相反,出於某種原因,我得到等價的:

array([(0, 3392), (0, 4159), (0, 1093), (0, 9836)], 
    dtype=[('code', '<i4'), ('id', '<i2')]) 

什麼會導致將被歸零所有的「代碼」值超出這樣的,如果事實上,這不是從ndarray.astype預期的結果?謝謝。 (如果它是相關的,我使用Python 3.)

編輯:下面是在用字典處理後的實際數據的快照。

array([('1', 2814), ('1', 1185), ('1', 6836), ('2', 7057), ('1', 5403),... 

    ('1', 1642), ('1', 3967), ('2', 7982), ('1', 6139), ('1', 9934), 
    ('2', 9932), ('1', 3044), ('1', 2769)], 
    dtype=[('name', '<U24'), ('id', '<i2')]) 
+0

故障數據示例? – Veedrac

+0

我無法分享原始數據或用於隱私原因的實際字典,但是我通過字典運行後用大量數據編輯了原始問題。 – trynthink

回答

0

我的猜測是,你這樣做是:

baddata = numpy.array([('1', 2814), ('1', 1185), ('1', 6836), ('2', 7057), ('1', 5403), 
    ('1', 1642), ('1', 3967), ('2', 7982), ('1', 6139), ('1', 9934), 
    ('2', 9932), ('1', 3044), ('1', 2769)], 
    dtype=[('name', '<U24'), ('id', '<i2')]) 

baddata.astype([('code', 'i4')]) 
#>>> array([(0,), (0,), (0,), (0,), (0,), (0,), (0,), (0,), (0,), (0,), (0,), 
#>>>  (0,), (0,)], 
#>>>  dtype=[('code', '<i4')]) 

當你的意思是這樣做的:

baddata = numpy.array([('1', 2814), ('1', 1185), ('1', 6836), ('2', 7057), ('1', 5403), 
    ('1', 1642), ('1', 3967), ('2', 7982), ('1', 6139), ('1', 9934), 
    ('2', 9932), ('1', 3044), ('1', 2769)], 
    dtype=[('name', '<U24'), ('id', '<i2')]) 

baddata.astype([('name', 'i4')]) 
#>>> array([(1,), (1,), (1,), (2,), (1,), (1,), (1,), (2,), (1,), (1,), (2,), 
#>>>  (1,), (1,)], 
#>>>  dtype=[('name', '<i4')]) 

註名

+0

你是對的。當我使用'ndarray.astype'時,我將字符串的類型更改爲字符串_and_同時更改列名稱。原來的dtype是:'[('name','U24'),('id','i2')]',我試圖將dtype改成:'[('type','i4'), ('id','i2')]'。這就是說,列名和數據類型不能同時改變的原因是什麼? – trynthink

+0

我不明白你是如何「改變」這個名字的。該名稱是指一列,當您「更改」名稱時,實際上是放棄舊列並初始化一個新列。嘗試'baddata.astype([('foo',' Veedrac

+0

錯誤和問題都是由於缺乏對dtype的基本理解而產生的,但現在我知道的更好。謝謝。 – trynthink