2016-01-19 15 views
5

Tôi đã tự hỏi liệu có tồn tại một hàm nào đó, có thể tính toán cùng một lúc di chuyển trung bình và kết hợp nó với np.diff không?Chức năng tương tự như khác biệt của Numpy

Nếu bạn có mảng và bạn sẽ tính giá trị trung bình cho cửa sổ di chuyển (trung bình di chuyển) và tính toán sự khác biệt giữa giá trị trung bình và phần tử tiếp theo.

Ví dụ:

a = [1, 3, 4, 5, 15, 14, 16, 13] 
b = np.diff(a) 
#np.diff makes something like this: `[n] - [n-1]` 
#I want something like this: `[n] - np.mean([n-m : n])` 

#I would like to have a function, where I could vary `m`: 

m = 2 
d = [2, 1.5, 10.5, 4, 1.5, -2] 

Làm thế nào tôi sẽ thực hiện nó, vì vậy mà thời gian tính toán sẽ không được lâu như vậy, vì tôi muốn sử dụng nó cho một loạt các yếu tố 26000 và cao hơn m?

Trả lời

3

Chỉnh sửa 1: OP đã cập nhật câu hỏi của mình sau khi tôi đã đưa ra câu trả lời đầu tiên. Câu trả lời được cập nhật có thể được tìm thấy bên dưới sau EDIT2.

Không chắc gì chính xác bạn cố gắng làm nhưng trong trường hợp này bạn chỉ có thể làm như sau để có được diff:

import numpy as np 
diff = np.array(array[n-1:]) - np.array(average[:-n+2]) 

Sau đó diff sẽ là đầu ra mong muốn:

array([ 2. , 1.5, 10.5, 4. , 1.5, -2. ]) 

Vì vậy, trước tiên bạn cắt các danh sách của mình bằng cách sử dụng tham số n, sau đó chuyển đổi danh sách của bạn sang mảng và trừ chúng khỏi nhau. Dòng mã trên thậm chí sẽ đơn giản hơn nếu a) danh sách của bạn có cùng độ dài, b) n là chỉ mục của bạn chứ không phải phần tử bạn muốn bắt đầu và c) nếu bạn sử dụng mảng có nhiều mảng thay vì danh sách:

import numpy as np 

# add one additional value so that the arrays have the same length 
myArray = np.array([1, 3, 4, 5, 15, 14, 16, 13, 17]) 

# choose the starting index rather than the element 
n = 2 

myAverage = np.array([2, 3.5, 4.5, 10, 14.5, 15, 14.5]) 

diffAr = myArray[n:] - myAverage 

Sau đó diffAr trông như thế này (một yếu tố hơn trong trường hợp của bạn vì tôi đã thêm một yếu tố để myArray):

array([ 2. , 1.5, 10.5, 4. , 1.5, -2. , 2.5]) 

Chỉ cần một nhận xét chung: Xin đừng sử dụng arraydiff như tên biến.

EDIT2:

Bạn đã thay đổi câu hỏi của mình; đây là một câu trả lời được cập nhật. Điều duy nhất người ta phải thêm vào câu trả lời ở trên là một cách để tính trung bình đang chạy cho kích thước cửa sổ m. Sau đó, người ta có thể thực hiện chính xác những gì tôi đã làm ở trên:

import numpy as np 

def runningMean(ar, m): 

    return np.convolve(ar, np.ones((m,))/m)[(m-1):] 

a = np.array([1, 3, 4, 5, 15, 14, 16, 13]) 
m = 2 
av = runningMean(a, m) 

d = a[m:] - av[:-m] 

Trong trường hợp này d chứa các đầu ra mong muốn:

array([ 2. , 1.5, 10.5, 4. , 1.5, -2. ]) 
+0

@ Cleb Cảm ơn bạn đã trả lời của bạn, tôi nhận ra sau đó là một chút bối rối . Do đó tôi đã thay đổi ví dụ của mình. – Mapa

+0

@Mapa: Tôi đã cập nhật câu trả lời; cho tôi biết nếu điều đó bây giờ trả lời câu hỏi của bạn. – Cleb

+1

Có. Cảm ơn bạn. – Mapa

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