2017-06-13 26 views
2

我正在處理一個數據處理項目,我通常希望將一維numpy數組作爲輸入,並輸出一個等長的數組,其元素是通過處理一定數量的輸入元素生成的。 這是一個相對簡單的問題來解決使用for循環,但我想知道如果numpy有內置的方式做到這一點,我認爲會明顯更快。爲了說明我的目標,設想一次生成一個向量(B)1元素,並且讓當前生成的元素爲元素N(表示爲B [N])。有沒有一種好方法在numpy數組上進行「移動」計算?

說,我想B到被它的元素對應於一個簡單的移動平均線向量A的元素的矢量 我想可以說是

B[i] = AVG(A[(i-N):i]) #N <= i < len(A) 

在哪裏我這裏是迭代任何底層循環的索引正在運行,AVG是一個通用函數,用於計算傳遞給它的數字組的平均值。

正如我所說的,使用for循環很容易,但這看起來像一個像numpy這樣的事情應該能夠很容易做到,所以我想我會問我的代碼之前,我的代碼與不到最佳結構。

+0

不幸的是,這需要一個具體的例子來回答。 –

+0

@ J.C。雷濤。這個問題與這個問題無關。 OP正試圖擺脫使用原始Python並改用numpy。 –

+0

你玩過'np.cumsum'和'np.cumprod'這樣的函數嗎? – hpaulj

回答

1

在Pandas查看standard moving window functions。例如,窗口大小爲10的移動平均值將爲pd.rolling_mean(data, window=10)

您也可以提供您自己的聚合功能pd.rolling_apply(data, lambda x: np.mean(x), window=10),與上一個相同。

+1

雖然熊貓絕對不是擺脫桌面,現在我真的特別想知道numpy。這看起來確實是我想要做的,但最後,謝謝你的提示! –

+0

我接受這個答案,儘管它沒有完全遵守最初的問題。 @Mad物理學家的回答對於所問的具體問題是一個很好的解決方案。但是,如果一個項目需要應用多種不同的過程算法,這個解決方案就顯得更加適用。單獨使用這個功能,熊貓是值得的。 –

1

有點低級,但是可以通過將數據與您選擇的窗口進行交叉關聯來過濾數據。移動平均窗口是由許多人分成的一羣人。請注意,關聯具有不同的「模式」,並且開始/結束點的有效性會有所不同。

import numpy as np 
import scipy.signal as signal 
import matplotlib.pyplot as plt 

window_size = 10 
window = np.ones(window_size)/window_size 
x = np.random.rand(100) 

x_filt = signal.correlate(x, window, mode='same') 

f, ax = plt.subplots() 
ax.plot(x) 
ax.plot(x_filt) 

0

不使用卷積的最簡單的純numpy的解決方案是使用np.cumsum之一。基本思想是指數i - N到指數i(含)之間的元素總和爲i的累計總和減去累計總和爲i - N - 1。標準化就是N本身:

s = np.cumsum(A) 
B = (s[N:] - s[:-N])/N 

,如果你想B是相同長度A目前尚不清楚。如果是這樣,你可以,例如,使用np.concatenatenp.r_預先準備的累計總和的第一NB

B = np.concatenate((s[:N]/np.arange(N), (s[N:] - s[:-N])/N)) 

OR

B = np.r_[s[:N]/np.arange(N), (s[N:] - s[:-N])/N] 

寫在這之後,我意識到,@Jaime有與基本相同的問題here非常相似的答案。我將保留我的答案,因爲它正確地規範了數組的初始部分,我不相信Jaime的答案。

相關問題