2012-06-21 20 views
5

Ich zeichne mehrere Spalten einer großen Datenmenge (durch numpy.genfromtxt) gegen eine gleich große Zeitspalte. Fehlende Daten werden oft als nan, -999, -9999 usw. bezeichnet. Allerdings kann ich nicht herausfinden, wie man mehrere Werte aus dem Array entfernt. Dies ist, was ich derzeit habe:Erstellen eines maskierten Arrays in Python mit mehreren gegebenen Werten

for cur_col in range(start_col, total_col): 
    # Generate what is to be graphed by removing nan values 
    data_mask = (file_data[:, cur_col] != nan_values) 
    y_data = file_data[:, cur_col][data_mask] 
    x_data = file_data[:, time_col][data_mask] 

Nach dem Punkt verwende ich matplotlib, um die entsprechenden Zahlen für jede Spalte zu erstellen. Dies funktioniert gut, wenn der nan_values ​​eine einzelne ganze Zahl ist, aber ich suche nach einer Liste.

EDIT: Hier ist ein Arbeitsbeispiel.

import numpy as np 

file_data = np.arange(12.0).reshape((4,3)) 
file_data[1,1] = np.nan 
file_data[2,2] = -999 
nan_values = -999 

for cur_col in range(1,3): 
    # Generate what is to be graphed by removing nan values 
    data_mask = (file_data[:, cur_col] != nan_values) 
    y_data = file_data[:, cur_col][data_mask] 
    x_data = file_data[:, 0][data_mask] 
    print 'y: ' + str(y_data) 
    print 'x: ' + str(x_data) 
print file_data 

>>> y: [ 1. nan 7. 10.] 
    x: [ 0. 3. 6. 9.] 
    y: [ 2. 5. 11.] 
    x: [ 0. 3. 9.] 
    [[ 0. 1. 2.] 
    [ 3. nan 5.] 
    [ 6. 7. -999.] 
    [ 9. 10. 11.]] 

Dies wird nicht, wenn nan_values ​​= [ 'nan', -999] arbeiten, das ist es, was ich zu erreichen suchen.

+0

bitte die Probe Array schreiben (Liste). –

+0

@AshwiniChaudhary Ich habe die Frage bearbeitet, um ein funktionierendes Beispiel einzubeziehen. – Josiah

Antwort

4

Ich würde vorschlagen, masked arrays wie so verwenden:

>>> a = np.arange(12.0).reshape((4,3)) 
>>> a[1,1] = np.nan 
>>> a[2,2] = -999 
>>> a 
array([[ 0., 1., 2.], 
     [ 3., nan, 5.], 
     [ 6., 7., -999.], 
     [ 9., 10., 11.]]) 
>>> m = np.ma.array(a,mask=(~np.isfinite(a) | (a == -999))) 
>>> m 
masked_array(data = 
[[0.0 1.0 2.0] 
[3.0 -- 5.0] 
[6.0 7.0 --] 
[9.0 10.0 11.0]], 
      mask = 
[[False False False] 
[False True False] 
[False False True] 
[False False False]], 
     fill_value = 1e+20) 
+0

Während die Ergebnisse sind, was ich brauche, verwendet es keine Liste, die stark rationalisieren würde, was ich tue. Gibt es eine Möglichkeit, die oder Anweisungen durch eine Liste für die Maske = im ma.array zu ersetzen? – Josiah

+2

'mask = np.logical_or.reduce ([a == Wert für Wert in [-99, -999, -9999]])'. Seien Sie sich jedoch dessen bewusst, dass "np.nan! = Np.nan", also müssen Sie das explizit zur Maske hinzufügen. – user545424

+0

Ausgezeichnet, genau was ich brauchte. Vielen Dank. – Josiah

2

Ich würde versuchen, so etwas wie (Pseudo-Code):

nan_values = [...] 

for cur_col in range(start_col, total_col): 
    # Generate what is to be graphed by removing nan values 
    y_data = [file_data[i,cur_col] for i in range(len(file_data)) if not(file_data[i,cur_col] in nan_values)] 
    x_data = [file_data[i,time_col] for i in range(len(file_data)) if not(file_data[i,cur_col] in nan_values)] 
+0

Ich kann dieses Beispiel nicht in das Arbeitsbeispiel implementieren, das ich kürzlich hinzugefügt habe. Ich erhalte 'Argument vom Typ' int 'ist nicht iterierbar' – Josiah

Verwandte Themen