Cách xóa tất cả các hàng trong một numpy.ndarray chứa các giá trị không phải số


95

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 tập dữ liệu dưới dạng numpy.ndarray và một số giá trị bị thiếu (có thể là do không có ở đó, đang tồn tại NaNhoặc là một chuỗi được viết " NA").

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

Câu trả lời:


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

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 Truewhere NaN, Falseở nơi khác. .any(axis=1)giảm một m*nmảng thành nbằng một phép ortoán logic trên toàn bộ các hàng, ~đảo ngược True/Falsea[ ]chỉ chọn các hàng từ mảng ban đầu, có Truetrong dấu ngoặc.


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

7
@ naught101 Bạn cũng cần thay đổi anythành all. Vì bạn muốn chọn các hàng mà "tất cả là hữu hạn", thay vì chọn các hàng mà "không phải bất kỳ là nan".
AnnanFay
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.