2012-11-09 12 views
5

Ho una tabella di grandi dimensioni (numeri in formato testo) che vorrei caricare con numpy.genfromtxt(). Vorrei ignorare le prime n colonne, ad esempio 5. Non conosco le dimensioni della tabella (numero di righe o colonne) in anticipo.Salta un numero specificato di colonne con numpy.genfromtxt()

Ho visto che genfromtxt() ha un'opzione skip_header che consente di saltare un numero specificato di righe di intestazione, ma sembra che non ci sia tale opzione per le colonne. C'è un'opzione usecols ma devo specificare i numeri di colonna che voglio conservare, piuttosto che quelli che voglio scartare (non conosco questo numero in anticipo).

Ovviamente potrei semplicemente caricare tutto e poi buttare via le prime n colonne, ma questo non è elegante ed è uno spreco in termini di memoria.

Inoltre, è possibile visualizzare il numero massimo di colonne, quindi creare l'argomento usecols, ma è piuttosto complicato.

Qualche idea su come risolvere questo elegantemente? C'è qualche argomento nascosto/non documentato che posso usare?

risposta

10

Nelle versioni più recenti di Numpy, np.genfromtxt può assumere un argomento iterabile, in modo da poter avvolgere il file che si sta leggendo in un generatore che genera linee, saltando le prime colonne N. Se i numeri sono separati da spazi, che è qualcosa di simile

np.genfromtxt(" ".join(ln.split()[N:]) for ln in f) 
+0

Nizza, io didn lo so. – Bitwise

+0

cosa c'è che non va? firstImage = np.genfromtxt ("" .join (ln.split() [1:]) per ln in path + next (iter (filelist))) – Klasik

17

Per le versioni più vecchie di NumPy, sbirciando in prima linea a scoprire il numero di colonne che non è difficile:

import numpy as np 
with open(fname, 'r') as f: 
    num_cols = len(f.readline().split()) 
    f.seek(0) 
    data = np.genfromtxt(f, usecols = range(5,num_cols)) 
print(data) 
+0

7 upvotes per andare fino al badge d'oro Numpy, unutbu :) –

+0

woohoo ! Non lo sapevo :) – unutbu

+2

@larsmans lo inviterò per quello;) – Bitwise

Problemi correlati