2013-04-25 16 views
6

consideri la matriceforzata conversione di matrici NumPy non numerici con sostituzione NAN

x = np.array(['1', '2', 'a'])

legatura per convertire in una matrice galleggiante solleva un'eccezione

x.astype(np.float) 
ValueError: could not convert string to float: a 

Does NumPy fornire alcun modo efficiente per costringere questo in un array numerico, sostituendo valori non numerici con qualcosa come NAN?

In alternativa, esiste una funzione numpy efficiente equivalente a np.isnan, ma che verifica anche elementi non numerici come le lettere?

risposta

10

È possibile convertire un array di stringhe in un array di carri (con NaNs) utilizzando np.genfromtxt:

In [83]: np.set_printoptions(precision=3, suppress=True) 

In [84]: np.genfromtxt(np.array(['1','2','3.14','1e-3','b','nan','inf','-inf'])) 
Out[84]: array([ 1. , 2. , 3.14 , 0.001, nan, nan, inf, -inf]) 

In python3 si avrebbe bisogno di convertire la matrice di byte prima, ad esempio, come via np.astype():

In [18]: np.genfromtxt(np.array(['1','2','3.14','1e-3','b','nan','inf','-inf']).astype('bytes')) 
Out[18]: array([ 1. , 2. , 3.14 , 0.001, nan, nan, inf, -inf]) 

Ecco un modo per identificare stringhe "numerici":

In [34]: x 
Out[34]: 
array(['1', '2', 'a'], 
     dtype='|S1') 

In [35]: x.astype('unicode') 
Out[35]: 
array([u'1', u'2', u'a'], 
     dtype='<U1') 

In [36]: np.char.isnumeric(x.astype('unicode')) 
Out[36]: array([ True, True, False], dtype=bool) 

nota che "numerico": un unicode che contiene solo caratteri numerici - cioè, caratteri che hanno la proprietà del valore numerico Unicode. Lo standard non include il punto decimale. Quindi u'1.3' non è considerato "numerico".

+0

'np.genfromtxt' è perfetto, grazie! – ChrisB

+0

Questa risposta potrebbe richiedere una revisione per python3 - Otterrai 'TypeError: Impossibile convertire 'byte' oggetto in str implicitamente '. –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ: Grazie per l'heads-up. Risolto problema con 'astype ('bytes')'. – unutbu

4

Se capita di usare panda così si potrebbe usare il metodo pd.to_numeric():

In [1]: import numpy as np 

In [2]: import pandas as pd 

In [3]: x = np.array(['1', '2', 'a']) 

In [4]: pd.to_numeric(x, errors='coerce') 
Out[4]: array([ 1., 2., nan]) 
0

pd.to_numeric può essere usato così com'è per qualsiasi matrice 1D. Tuttavia, per qualsiasi array N-D arbitraria (N> 1), si ottiene questo:

TypeError: arg must be a list, tuple, 1-d array, or Series 

Quindi, è necessario fare un po 'di più. Per esempio:

In [340]: a 
Out[340]: 
array([['1', '1.1', 'a'], 
     ['ab', '1', '1.1']], 
     dtype='<U32') 

Ora, rimodellare, convertire, e poi ri-Reshape:

In [341]: pd.to_numeric(a.reshape(-1,), errors='coerce').reshape(a.shape) 
Out[341]: 
array([[ 1. , 1.1, nan], 
     [ nan, 1. , 1.1]]) 
Problemi correlati