2010-12-30 4 views
15

Sto leggendo in un file usando numpy.genfromtxt che introduce colonne di stringhe e valori numerici. Una cosa che devo fare è rilevare la lunghezza dell'input. Questo va bene a condizione che ci sia più di un valore letto in ogni array.Come rilevare la lunghezza di una matrice numpy con un solo elemento?

Ma ... se c'è un solo elemento nell'array risultante, la logica ha esito negativo. Posso ricreare un esempio qui:

import numpy as np 
a = np.array(2.3) 

len (a) restituisce un errore che dice:

TypeError: len() of unsized object 

Tuttavia, se una ha 2 o più elementi, len() si comporta come ci si aspetterebbe.

import numpy as np 
a = np.array([2.3,3.6]) 

len (a) restituisce 2

La mia preoccupazione qui è, se uso un po 'strana la gestione delle eccezioni, non riesco a distinguere tra un essere vuoto e una con lunghezza = 1.

EDIT: @noskio ha suggerito di impostare a = np.array ([2.3]). Il problema è che la vera genesi di a è usando numpy.genfromtxt. Il codice è simile:

import numpy as np 
indata = np.genfromtxt(some_filename, names=True,dtype=None) 
a = indata['one_col_headername'] 

Di conseguenza, se Indata è solo una riga nel file, a è un array di 0-d.

+1

'matrice ([2])' è un array con un elemento e 1 dimensione . 'array (2)' è un array con zero rank o zero dimensions. – endolith

risposta

32

Se avete bisogno di un one-liner (supponendo che la risposta che ci si aspetta è di 1):

In [1]: import numpy as np 

In [2]: a = np.array(2.3) 

In [3]: len(np.atleast_1d(a)) 
Out[3]: 1 

This page spiega perché si è deciso di implementare gli array 0-dimensionali in NumPy.

+1

Grazie a @pberkes! Questo aiuta tonnellate e risolve il problema – mishaF

+0

Il collegamento è interrotto :( – wim

+2

@wim sembra che il collegamento sia stato rimosso, e non riesco a trovare un sostituto per questo – pberkes

0
a = np.array([2.3]) 
print len(a) 
+0

funziona come una costante come si mostra, ma non per un ingresso di array – ecoe

6
import numpy as np 

tests=[np.array(2.3),np.array([]),np.array([2.3]),np.array([2.3,3.6])] 

print('{a:30}{s:<10}{l:<10}{sl:<10}'.format(a='repr',s='shape',sl='len(shape)',l='length')) 
for a in tests: 
    s=a.shape 
    l=len(a) if a.shape else 0 
    sl=len(s) 
    print('{a!r:30}{s:<10}{l:<10}{sl:<10}'.format(a=a,l=l,s=s,sl=sl)) 

rendimenti

repr       shape  length len(shape) 
array(2.2999999999999998) ()  0   0   
array([], dtype=float64)  (0,)  0   1   
array([ 2.3])     (1,)  1   1   
array([ 2.3, 3.6])   (2,)  2   1   

È possibile distinguere un array "vuoto" (ad esempio np.array([])) e uno scalare NumPy (ad esempio np.array(2.3)) osservando la lunghezza della forma.

+0

Grazie a @unubtu. È bello, ma come faccio a distinguere tra una lunghezza 1 e una vuota? – mishaF

+0

Capito! Questo aiuta le tonnellate. – mishaF

3

Sembra che la proprietà size di ndarrays funzioni in questo caso se si sa che l'array è monodimensionale. A mio parere, lo a.size è molto più leggibile di len(np.atleast_1d(a)). Si noti tuttavia che la proprietà size restituirà la totale numero di elementi nell'array se ha più di una dimensione:

In [1]: import numpy as np 

In [2]: np.array(2.3).size 
Out[2]: 1 

In [3]: np.array([1, 2]).size 
Out[3]: 2 

In [4]: np.array([[1,2], [3,4]]).size 
Out[4]: 4 
Problemi correlati