2011-07-25 34 views
23

Có cách nào để thực hiện hiệu quả cửa sổ cuộn cho mảng 1D trong Numpy không?Cửa sổ cuộn cho mảng 1D trong Numpy?

Ví dụ, tôi có đoạn mã Python tinh khiết này để tính toán độ lệch chuẩn cán cho một danh sách 1D, nơi observations là danh sách 1D các giá trị, và n là chiều dài cửa sổ cho độ lệch chuẩn:

stdev = [] 
for i, data in enumerate(observations[n-1:]): 
    strip = observations[i:i+n] 
    mean = sum(strip)/n 
    stdev.append(sqrt(250*sum([(s-mean)**2 for s in strip])/(n-1))) 

Có cách nào để thực hiện điều này hoàn toàn trong Numpy, tức là, không có bất kỳ vòng lặp Python nào không? Độ lệch tiêu chuẩn là tầm thường với numpy.std, nhưng phần cửa sổ lăn hoàn toàn làm tôi nổi bật.

Tôi đã tìm thấy this bài đăng trên blog liên quan đến một cửa sổ cuộn trong Numpy, nhưng dường như không phải dành cho mảng 1D.

+0

Bạn cũng có thể có một cái nhìn tại [Dự án nút cổ chai] (https://github.com/kwgoodman/ nút cổ chai), nó đã được xây dựng trong di chuyển trung bình, std, vv – derchambers

Trả lời

36

Chỉ cần sử dụng mã blog, nhưng áp dụng chức năng của bạn cho kết quả.

tức

numpy.std(rolling_window(observations, n), 1) 

nơi bạn có (từ blog):

def rolling_window(a, window): 
    shape = a.shape[:-1] + (a.shape[-1] - window + 1, window) 
    strides = a.strides + (a.strides[-1],) 
    return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides) 
+0

Nó có hợp lệ cho bất kỳ loại dữ liệu? – Lee

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