2013-04-24 52 views
7

Tôi cần một phương pháp nhanh, tốt để tìm 10 giá trị thực nhỏ nhất từ ​​mảng có nhiều giá trị nan và/hoặc inf.Lấy các giá trị N nhỏ nhất từ ​​mảng numpy bỏ qua inf và nan

Tôi cần phải xác định các chỉ số của các giá trị thực nhỏ nhất này, chứ không phải chính các giá trị đó.

Tôi đã tìm thấy các chức năng argminnanargmin từ không có nhiều. Họ không thực sự nhận được công việc làm vì tôi cũng muốn chỉ định nhiều hơn 1 giá trị, ví dụ như tôi muốn có 100 giá trị nhỏ nhất. Cả hai đều trả về giá trị -inf là giá trị nhỏ nhất khi nó có mặt trong mảng.

heapq.nsmallest loại công trình, nhưng nó cũng trả về giá trị nan-inf làm giá trị nhỏ nhất. Ngoài ra nó không cho tôi những chỉ số mà tôi đang tìm kiếm.

Mọi trợ giúp ở đây sẽ được đánh giá cao.

+0

lặp qua/sao chép mảng, chuyển đổi tất cả các nans và -inf thành inf chạy hàm của bạn để nhận giá trị N nhỏ nhất, chuyển đổi lại/hoàn nguyên về bản sao cũ? ngớ ngẩn hacky, nhưng hmm ... – Patashu

+0

cảm ơn sự giúp đỡ, đó là những gì tôi sẽ phải làm gì nếu tôi không thể có được một câu trả lời đơn giản hơn. –

Trả lời

10

Giá trị duy nhất cần loại bỏ này là các giá trị vô hạn âm. Vì vậy hãy thử:

import numpy as np 
a = np.random.rand(20) 
a[4] = -np.inf 
k = 10 
a[np.isneginf(a)] = inf 
result = a[np.argsort(a)[:k]] 
+1

'2 * np.max' không hoạt động nếu tất cả các phần tử đều âm, tốt hơn là chỉ sử dụng' inf' mà tôi nghĩ. – interjay

+0

vâng tôi chỉ thực hiện nó –

+0

Có, điểm tốt .. – YXD

1

bạn có thể tìm thấy những chỉ số của infNan như thế này:

a=np.array([[12,12,111],[np.inf,np.inf,1,2,3],[np.nan,7,8]]) 

các bạn lặp qua a và có thể kiểm tra xem nó với:

for item in a:  
    idxInf=(np.isnan(a[item])).nonzero() 
    idxNan=(np.isnan(a[item])).nonzero() 

ví dụ:

In [17]: (np.isnan(a[2])) 
Out[17]: array([ True, False, False], dtype=bool) 

In [18]: (np.isnan(a[2])).nonzero() 
Out[18]: (array([0]),) 
2

Dường như với tôi như bạn chỉ có thể lấy các giá trị hữu hạn đầu tiên n từ mảng được sắp xếp của bạn, thay vì cố sửa đổi mảng ban đầu, điều này có thể nguy hiểm.

n = 10 
b = np.sort(a) 
smalls = b[np.isfinite(b)][n:] 
Các vấn đề liên quan