Cara menghapus semua baris dalam numpy.ndarray yang berisi nilai non-numerik

95

Pada dasarnya, saya melakukan beberapa analisis data. Saya membaca dalam kumpulan data sebagai numpy.ndarray dan beberapa nilai hilang (baik dengan tidak berada di sana, berada NaN, atau dengan string yang ditulis " NA").

Saya ingin membersihkan semua baris yang berisi entri seperti ini. Bagaimana cara melakukannya dengan ndarray numpy?

kuda zebra
sumber

Jawaban:

164
>>> a = np.array([[1,2,3], [4,5,np.nan], [7,8,9]])
array([[  1.,   2.,   3.],
       [  4.,   5.,  nan],
       [  7.,   8.,   9.]])

>>> a[~np.isnan(a).any(axis=1)]
array([[ 1.,  2.,  3.],
       [ 7.,  8.,  9.]])

dan menetapkan kembali ini ke a.

Penjelasan: np.isnan(a)mengembalikan larik serupa dengan Truewhere NaN, di Falsetempat lain. .any(axis=1)mengurangi m*narray menjadi ndengan oroperasi logis pada seluruh baris, ~membalikkan True/Falsedan a[ ]memilih hanya baris dari array asli, yang ada Truedi dalam tanda kurung.

eumiro
sumber
11
np.isfinitejuga berguna dalam kasus ini, serta saat Anda ingin menyingkirkan ±Infnilai. Itu tidak memerlukan ~, karena mengembalikan true hanya untuk real terbatas.
n nothing101
7
@ naught101 Anda juga perlu mengubah anyke all. Karena Anda ingin memilih baris di mana "semua terbatas", daripada memilih baris di mana "tidak ada nan".
AnnanFay