2015-07-09 93 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]

相关问题