2013-02-09 35 views
6

Tôi đang cố gắng trích xuất các chỉ số của tất cả các giá trị của một mảng 1D số vượt quá một số ngưỡng. Mảng nằm trên thứ tự của 1e9 dài.Tăng tốc độ của NumPy nơi chức năng

cách tiếp cận của tôi là như sau trong NumPy:

idxs = where(data>threshold) 

này có một cái gì đó lên tới 20 phút, đó là không thể chấp nhận. Làm thế nào tôi có thể tăng tốc độ chức năng này? Hoặc, có lựa chọn thay thế nhanh hơn không?

(Để cụ thể, phải mất lâu trên máy Mac OS X 10.6.7 chạy, 1,86 GHz Intel, 4GB RAM không làm gì khác.)

+0

Mất 20 phút để chạy np.where hoặc để xóa các giá trị bên dưới ngưỡng? –

+0

Mất 20 phút để chạy np.where – mac389

+0

Có vấn đề gì khi tôi gọi từng biến từ một từ điển? I E. 'dữ liệu' thực sự là' dữ liệu ['thời gian'] và ngưỡng thực sự là 'dữ liệu [ngưỡng] [gai]'. Tôi chắc chắn biến thứ hai là một vô hướng. – mac389

Trả lời

4

Thử mask array. Điều này tạo ra một cái nhìn của cùng một dữ liệu.

Vì vậy, cú pháp sẽ là:

b=a[a>threshold] 

b không phải là một mảng mới (không giống như ở đâu) nhưng một cái nhìn của một nơi các yếu tố đáp ứng boolean trong chỉ mục.

Ví dụ:

import numpy as np 
import time 

a=np.random.random_sample(int(1e9)) 

t1=time.time() 
b=a[a>0.5] 
print(time.time()-t1,'seconds') 

Trên máy tính của tôi, đó in 22.389815092086792 seconds


chỉnh sửa

tôi đã cố gắng cùng với np.where, và nó chỉ là càng nhanh. Tôi nghi ngờ: bạn có xóa các giá trị này khỏi mảng không?

+0

Nếu tôi làm như vậy, điều đó là không chủ ý. Cú pháp của tôi giống như cú pháp của bạn. Làm thế nào tôi có thể xóa một cái gì đó? Tôi đồng ý nó sẽ giải thích thời gian chậm hơn. – mac389

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