2015-07-09 92 views
3

給定一個填充字符串的numpy數組my_arr,如何設置其中一列的數據類型爲float?我需要它作爲一個numpy數組,以便隨後使用它與我現有的代碼。見下面的例子一個失敗的嘗試:使numpy數組的單列另一個數據類型

import numpy as np 

dat = [['User1', 'Male', '2.2'], ['User2', 'Female', '3.777'], ['User3', 'Unknown', '0.0']] 
my_arr = np.array(dat) 
print my_arr 
# [['User1' 'Male' '2.2'], ['User2' 'Female' '3.777'], ['User3' 'Unknown' '0.0']] 

my_arr[:,2] = my_arr[:,2].astype(np.float) 
print my_arr 
# [['User1' 'Male' '2.2'], ['User2' 'Female' '3.777'], ['User3' 'Unknown' '0.0']] 
+0

你有什麼樣的琴絃?像「2.3」,「7.89」或「myString」,「myString2」? 「沒有成功」是什麼意思?什麼地方出了錯? – Cleb

+0

查看更新後的帖子。 – pir

回答

1

這樣做可能有更明智的做法,但以下給出了我認爲正確的輸出;您可以使用structured arrays

import numpy as np 
dat = [['User1', 'Male', '2.2'], ['User2', 'Female', '3.777'], ['User3', 'Unknown', '0.0']] 

# create data types: two strings of length 10 and float 
dt = np.dtype('a10, a10, float') 

# convert the inner lists to tuples so that a structured array can be used 
for ind, l in enumerate(dat): 
    dat[ind] = tuple(l) 

# convert dat to an array 
my_arr = np.array(dat, dt) 

輸出:

array([('User1', 'Male', 2.2), ('User2', 'Female', 3.777), 
     ('User3', 'Unknown', 0.0)], 
     dtype=[('f0', 'S10'), ('f1', 'S10'), ('f2', '<f8')]) 

您也可以通過做給名稱的列:

dt = {'names': ['user', 'gender', 'number'], 'formats':['a10', 'a10', 'float']} 
my_arr = np.array(dat, dt) # dat is the list with tuples, see above 

輸出現在是:

array([('User1', 'Male', 2.2), ('User2', 'Female', 3.777), 
     ('User3', 'Unknown', 0.0)], 
     dtype=[('user', 'S10'), ('gender', 'S10'), ('number', '<f8')]) 

然後你可以交流做一個單獨的列

my_arr['number'] 
array([ 2.2 , 3.777, 0. ]) 

my_arr['user'] 
array(['User1', 'User2', 'User3'], dtype='|S10') 

我會建議使用在Python pandas一個數據幀在這裏您可以輕鬆應對不同的數據類型和複雜的數據結構。

對於示例:

import pandas as pd 
pd.DataFrame(dat, columns=['user', 'gender', 'some number']) 

會那麼簡單地給你:

user gender some number 
0 User1  Male   2.2 
1 User2 Female  3.777 
2 User3 Unknown   0.0 
1

則可以將二維數組轉換成結構化的陣列混合dtype

In [137]: my_arr 
Out[137]: 
array([['User1', 'Male', '2.2'], 
     ['User2', 'Female', '3.777'], 
     ['User3', 'Unknown', '0.0']], 
     dtype='<U7') 

In [138]: dt=np.dtype('U7,U7,f') # complex dtype 

In [139]: np.array([tuple(row) for row in my_arr], dtype=dt) 
Out[139]: 
array([('User1', 'Male', 2.200000047683716), 
     ('User2', 'Female', 3.7769999504089355), ('User3', 'Unknown', 0.0)], 
     dtype=[('f0', '<U7'), ('f1', '<U7'), ('f2', '<f4')]) 

In [140]: _.shape 
Out[140]: (3,) 

現在是一個1d陣列3場。而不是按名稱訪問列,您可以按名稱訪問字段,arr['f0']等。

我使用了[tuple(row) for row in my_arr],因爲結構化數組的輸入必須是元組列表。我本可以使用您的dat列表,[tuple(row) for row in dat]

相關問題