2016-08-04 9 views
0

Ich habe eine (M x N) numpy-Array, die Zeichenfolge Werte, numerische Werte und Nans enthält. Ich möchte die Zeilen löschen, die NaN Werte enthalten. Ich habe versucht:Entfernen Sie NaNs aus numpy Array mit String-Werten und numerischen Werten

arr[~np.isnan(arr)] 

aber ich den Fehler:

TypeError: ufunc 'isnan' not supported for the input types, and the inputs 
could not be safely coerced to any supported types according to the casting rule ''save'' 

Lösung, die ich verwendet:

+0

Mögliche Duplikat [Effizientes wenn beliebiges Objekt überprüft NaN in Python/numpy/Pandas ist?] (Http://stackoverflow.com/questions/18689512/efficiently-checking-if-arbitrary-object-is- nan-in-python-numpy-pandas) –

+0

Es ist 2d, aber was ist der dtype? Objekt, Zeichenfolge? – hpaulj

Antwort

0

ich Ihre Fehler, wenn ich ein Objekt dtype Array machen:

In [112]: arr=np.ones((3,2),object) 
In [113]: arr 
Out[113]: 
array([[1, 1], 
     [1, 1], 
     [1, 1]], dtype=object) 
In [114]: np.isnan(arr) 
... 
TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe'' 

Das dtype ist der einzige, der Zahlen, Strings und np.nan (was ein Float ist) mischen kann. Sie können damit nicht viele ganze Array-Operationen ausführen.

Ich kann Ihre Lösung nicht ohne weiteres testen, da mehrere Variablen unbekannt sind.

Mit einer allgemeineren arr, sehe ich nicht, wie Sie eine Zeile ohne Wiederholung über beide Zeilen und Spalten entfernen können, testen, ob jeder Wert numerisch ist, und wenn numerisch isnan. np.isnan ist wählerisch und kann nur auf einem Schwimmer arbeiten.

Wie in den "möglichen Duplikat" Pandas isnull erwähnt ist allgemeiner.

Also im Grunde zwei Punkte:

  • was ein guter General Test ist, die Strings sowie Zahlen

  • können Sie bekommen um eine vollständige Iteration umgehen kann, das Array unter der Annahme dtype Objekt ist.

np.isnan on arrays of dtype "object" hier Meine Lösung ist es, eine Liste Verständnis in einer Schleife über ein 1D-Array zu tun.

Von dass ich jedes Element arr mit testen:

In [125]: arr 
Out[125]: 
array([['str', 1], 
     [nan, 'str'], 
     [1, 1]], dtype=object) 
In [136]: for row in arr: 
    ...:  for col in row: 
    ...:   print(np.can_cast(col,float) and np.isnan(col)) 
False 
False 
True 
False 
False 
False 
+0

Sehen Sie sich den Kommentar an, den ich gepostet habe. Die Lösung wäre, 'pandas.isnull' zu verwenden. –

+0

Wenn Sie' Pandas' installiert haben. – hpaulj

0

Eine Lösung ist man np.sum verwenden können() jede Zeile bis zu summieren. weil nan + any float = nan, so dass man sehen kann, welche Linien einen Nan-Wert enthalten.

np.sum(arr,axis = 1) 
rowsWithoutNaN = [ not(np.isnan(i)) for i in b] 
result = np.array([val for shouldKeep, val in zip(rowsWithoutNaN,arr) if shouldKeep]) 
+0

Dies funktioniert, wenn der 'arr.dtype' float ist. Aber das OP behauptet, dass es auch Strings enthält. – hpaulj

Verwandte Themen