有很多方法可以做到这一点,但有些方法比其他方法更干净。
通常,在 numpy 中,您将字符串数据保存在单独的数组中。
(事情比 R 的数据框架要低一些。通常只需将事情包装在一个类中以进行关联,但将不同的数据类型分开。)
老实说,numpy 并未针对处理此类“灵活”数据类型进行优化(尽管它肯定可以做到)。像pandas http://pandas.pydata.org/index.html为“类似电子表格”的数据提供更好的界面(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)