Ci sono diversi modi per farlo, ma alcuni sono più puliti di altri.
Di solito, in numpy, si mantengono i dati di stringa in un array separato.
(Le cose sono un po 'più basso livello rispetto, ad esempio, frame di dati di R. In genere basta avvolgere le cose in una classe per l'associazione, ma mantenere diversi tipi di dati separati.)
Onestamente, isn numpy ottimizzato per gestire tipi di dati "flessibili" come questo (sebbene possa certamente farlo). Cose come pandas
forniscono un'interfaccia migliore per i dati "simili al foglio di calcolo" (e i panda sono solo uno strato sopra a numpy).
Tuttavia, gli array strutturati (che è quello che hai qui) ti permetteranno di tagliarli a colonne quando passi in una lista di nomi di campi. (Ad esempio data[['col1', 'col2', 'col3']]
)
In ogni caso, in un modo è quello di fare qualcosa di simile:
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)
Tuttavia, questo è tutt'altro che ideale. Se si desidera eseguire l'operazione sul posto (come si è attualmente), la soluzione più semplice è quella che si ha già: basta scorrere i nomi dei campi.
Per inciso, utilizzando pandas
, si farebbe qualcosa di simile:
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 Grazie. Questa è una risposta molto istruttiva e perspicace. La suddivisione del set di dati in colonne numeriche e non numeriche è probabilmente la strada da percorrere. Questo rende molte altre operazioni ben definite ed è in effetti ciò che stavo cercando di fare. Non ero a conoscenza dell'opzione di usare 'data [elenco]' per selezionare più colonne. –