有许多方法可以做到这一点,但有些比其他方法更加清晰。通常,在numpy中,您将字符串数据保存在单独的数组中。
(事情比如R的数据框架更低级一些。您通常只需将其封装在一个类中以进行关联,但保持不同的数据类型分开。)
老实说,numpy并没有针对处理此类“灵活”数据类型进行优化(尽管它肯定可以做到)。像
pandas
这样的东西为“类似电子表格”的数据提供了更好的接口(而pandas只是numpy的一层)。
但是,结构化数组(就像您在这里拥有的那样)将允许您在传入字段名称列表时按列切片它们。(例如
data[['col1','col2','col3']]
)
无论如何,一种方法是像这样做:
import numpy as np
data = np.recfromcsv('iris.csv')
float_fields = list(data.dtype.names[:-1])
float_dat = data[float_fields]
float_dat = float_dat.view(np.float).reshape((data.size, -1))
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)
data[list]
来选择多个列的选项。 - Has QUIT--Anony-Mousse