Hay varias maneras de hacerlo, pero algunas son más limpias que otras.
Normalmente, en numpy, mantiene los datos de la cadena en una matriz separada.
(Las cosas son un poco más bajo nivel que, por ejemplo, las tramas de datos del R. Por lo general, acaba de envolver las cosas en una clase de la asociación, pero mantener diferentes tipos de datos por separado.)
Honestamente, ¿no numpy 'optimizado para manejar tipos de datos' flexibles 'como este (aunque ciertamente puede hacerlo). Cosas como pandas
proporcionan una mejor interfaz para los datos de "hoja de cálculo" (y pandas es solo una capa en la parte superior de numpy).
Sin embargo, las matrices estructuradas (que es lo que tiene aquí) le permitirán dividirlas en columnas cuando pasa una lista de nombres de campo. (Por ejemplo data[['col1', 'col2', 'col3']]
)
En cualquier caso, una forma es hacer algo como esto:
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)
Sin embargo, esto está lejos de ser ideal. Si desea realizar la operación in situ (como lo hace actualmente), la solución más fácil es la que ya tiene: simplemente itere sobre los nombres de los campos.
Por cierto, utilizando pandas
, que haría algo como esto:
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 Gracias. Esta es una respuesta muy informativa y perspicaz. Es probable que dividir el conjunto de datos en columnas numéricas y no numéricas sea el camino a seguir. Esto hace que muchas otras operaciones estén bien definidas y es, de hecho, lo que estaba tratando de hacer. No estaba al tanto de la opción de usar 'data [list]' para seleccionar varias columnas. –