<p>有很多方法可以做到这一点,但有些方法比其他方法更干净。</p>
<p>通常,在numpy中,将字符串数据保存在单独的数组中。</p>
<p>(事情比R的数据帧要低级一点。通常,您只需将内容打包到关联的类中,但要将不同的数据类型分开。)</p>
<p>老实说,numpy并没有为处理这种“灵活”的数据类型而优化(尽管它确实可以做到这一点)。像<a href="http://pandas.pydata.org/index.html">^{<cd1>}</a>这样的东西为“类似电子表格”的数据提供了更好的接口(而pandas只是numpy之上的一层)。</p>
<p>但是,当您传入字段名列表时,结构化数组(这就是您在这里所拥有的)将允许您按列对它们进行切片。(例如<code>data[['col1', 'col2', 'col3']]</code>)</p>
<p>无论如何,有一种方法是这样做:</p>
<pre><code>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)
</code></pre>
<p>然而,这远非理想。如果您想在适当的位置执行操作(如您当前所做的那样),最简单的解决方案是您已经拥有的:只需遍历字段名。</p>
<p>顺便说一下,使用<code>pandas</code>,您将执行以下操作:</p>
<pre><code>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)
</code></pre>