有很多方法可以做到,但有些方法比其他方法更清洁。
通常,在numpy中,您将字符串数据保存在单独的数组中。
(事情有点多级低比,也就是说,R的数据帧。通常,只需换东西了在该协会的一类,但保持不同的数据类型分开。)
老实说,numpy的ISN没有针对这种处理“灵活”数据类型进行优化(虽然它当然可以做到)。诸如pandas
之类的东西为“类似电子表格”的数据提供了更好的接口(而熊猫只是numpy之上的一层)。
然而,结构化数组(这是你在这里所能得到的)将允许你在传递字段名列表时按字段对它们进行切片。 (例如data[['col1', 'col2', 'col3']]
)
无论如何,一个办法就是做这样的事情:
import numpy as np
data = np.recfromcsv('iris.csv')
# In this case, it's just all but the last, but we could be more general
# This must be a list and not a tuple, though.
float_fields = list(data.dtype.names[:-1])
float_dat = data[float_fields]
# Now we just need to view it as a "regular" 2D array...
float_dat = float_dat.view(np.float).reshape((data.size, -1))
# And we can normalize columns as usual.
normalized = (float_dat - float_dat.min(axis=0))/float_dat.ptp(axis=0)
然而,这是很不理想。如果您想在原地进行操作(就像您现在所做的那样),最简单的解决方案就是您已有的操作:只需遍历字段名称即可。
顺便说一句,使用pandas
,你会做这样的事情:
import pandas
data = pandas.read_csv('iris.csv', header=None)
float_dat = data[data.columns[:-1]]
dmin, dmax = float_dat.min(axis=0), float_dat.max(axis=0)
data[data.columns[:-1]] = (float_dat - dmin)/(dmax - dmin)
+1谢谢。这是一个非常丰富和有见地的答案。将数据集分成数字列和非数字列可能是一条可行的路线。这使得许多其他操作的定义非常清晰,实际上我正在尝试这么做。我没有意识到使用'data [list]'选择多个列的选项。 – 2012-03-20 07:02:53