2015-02-10 12 views
9

Nói, tôi có một mảng NumPy gồm 10 yếu tố, ví dụ .:Đặt phần tử mảng NumPy bằng không nếu chúng nằm dưới một ngưỡng cụ thể

a = np.array([2, 23, 15, 7, 9, 11, 17, 19, 5, 3])

Bây giờ tôi muốn thiết lập một cách hiệu quả tất cả các a giá trị cao hơn hơn 10-0, vì vậy tôi sẽ nhận được:

[2, 0, 0, 7, 9, 0, 0, 0, 5, 3]

Làm thế nào tôi có thể đạt được điều đó theo cách hiệu quả nhất, ha ving trong tâm lớn mảng, nói, 10^6 yếu tố?

Bởi vì tôi sử dụng để sử dụng for vòng lặp, mà là rất chậm, Eg .:

# Zero values below "threshold value". 
def flat_values(sig, tv): 
    """ 
    :param sig: signal. 
    :param tv: threshold value. 
    :return: 
    """ 
    for i in np.arange(np.size(sig)): 
     if sig[i] < tv: 
      sig[i] = 0 
    return sig 

Cảm ơn bạn trước.

Trả lời

6

Nói chung, danh sách comprehensions là nhanh hơn so với for vòng trong python (vì python biết rằng nó không cần phải chăm sóc cho rất nhiều thứ có thể xảy ra trong một vòng lặp for thường xuyên):

a = [0 if a_ > thresh for a_ in a] 

nhưng, như @unutbu đúng pointed out, numpy cho phép danh sách chỉ mục, và yếu tố khôn ngoan so sánh đem lại cho bạn danh sách chỉ số, vì vậy:

super_threshold_indices = a > thresh 
a[super_threshold_indices] = 0 

sẽ còn nhanh hơn nữa.

Nói chung, khi áp dụng các phương pháp trên vectơ dữ liệu, hãy xem numpy.ufuncs, thường hoạt động tốt hơn nhiều so với hàm python mà bạn ánh xạ bằng bất kỳ cơ chế gốc nào.

34
In [7]: a = np.array([2, 23, 15, 7, 9, 11, 17, 19, 5, 3]) 

In [8]: a[a > 10] = 0 

In [9]: a 
Out[9]: array([2, 0, 0, 7, 9, 0, 0, 0, 5, 3]) 
+0

Câu trả lời hoàn hảo. Lưu ý rằng nếu bạn tình cờ quan tâm đến giá trị tuyệt đối của phần tử bạn có thể sử dụng: a [np.abs (a)> 10] = 0 –

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