2012-07-12 42 views
50

Về cơ bản, tôi đang thực hiện một số phân tích dữ liệu. Tôi đọc trong một tập dữ liệu như một numpy.ndarray và một số giá trị bị thiếu (hoặc bằng cách không ở đó, là NaN, hoặc bằng một chuỗi được viết "NA").Làm thế nào để loại bỏ tất cả các hàng trong một numpy.ndarray có chứa các giá trị phi số

Tôi muốn xóa tất cả các hàng chứa bất kỳ mục nhập nào như thế này. Làm thế nào để làm điều đó với một ndarray numpy?

Trả lời

98
>>> 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.]]) 

và gán lại điều này cho a.

Giải thích: np.isnan(a) trả về một mảng tương tự với True trong đó NaN, False ở nơi khác. .any(axis=1) giảm mảng m*n thành n bằng thao tác logic or trên toàn bộ hàng, ~ chuyển đổi True/Falsea[ ] chỉ chọn các hàng từ mảng ban đầu, có True trong dấu ngoặc vuông.

+0

Tuyệt vời cảm ơn bạn. Nó có thể được giải thích về những gì nó đang làm không? Vẫn còn một chút mới để numpy :) – zebra

+0

@ zebra - giải thích. – eumiro

+3

'np.isfinite' cũng hữu ích trong trường hợp này, cũng như khi bạn muốn loại bỏ các giá trị' ± Inf'. Nó không yêu cầu '~', vì nó trả về true chỉ cho các thực hữu hạn. – naught101

Các vấn đề liên quan