Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中对这两个循环进行矢量化?_Python_For Loop_Vectorization_Kalman Filter - Fatal编程技术网

如何在Python中对这两个循环进行矢量化?

如何在Python中对这两个循环进行矢量化?,python,for-loop,vectorization,kalman-filter,Python,For Loop,Vectorization,Kalman Filter,我在values中检索了接近400k的值,这本身相当慢(代码没有显示),然后我尝试通过Kalmann过滤器对这些值进行预测,第一个循环运行需要一分钟多一点,第二个大约2.5分钟,我想第一个可以矢量化,但是我不知道怎么做,特别是窗口。第二个循环我不确定如何处理增加x数组的I(x=np.append(x,new\u x\u col,axis=1)) 这是第一个,它尝试使用polyfit和polyval根据SMA的值进行预测: window_sma = 200 sma_index = 500 offs

我在
values
中检索了接近400k的值,这本身相当慢(代码没有显示),然后我尝试通过Kalmann过滤器对这些值进行预测,第一个循环运行需要一分钟多一点,第二个大约2.5分钟,我想第一个可以矢量化,但是我不知道怎么做,特别是
窗口。第二个循环我不确定如何处理增加x数组的I(
x=np.append(x,new\u x\u col,axis=1)

这是第一个,它尝试使用polyfit和polyval根据SMA的值进行预测:

window_sma = 200
sma_index = 500
offset = 50
SMA = talib.SMA(values, timeperiod = window_sma)
vector_X = [1, 2, 3, 15]
sma_predicted = []

start_time = time.time()
for i in range (sma_index, len(SMA)):
    j = int(i - offset)
    k = int(i - offset / 2)
    window_sma = [SMA[j], SMA[k], SMA[i]]
    polyfit = np.polyfit([1, 2, 3], window_sma, 2)
    y_hat = np.polyval(polyfit, vector_X)
    sma_predicted.append(y_hat[-1])
第二个,它试图过滤第一个for循环的输出,以便更好地预测我从SMA得到的值:

# Kalman Filter
km = KalmanFilter(dim_x = 2, dim_z = 1)

# state transition matrix
km.F = np.array([[1.,1.],
                [0.,1.]])
# Measurement function
km.H = np.array([[1.,0.]])

# Change in time
dt = 0.0001
a = 1.5

# Covariance Matrix
km.Q = np.power(a, 2) * \
       np.array([[np.power(dt,4)/4, np.power(dt,3)/2],
                 [np.power(dt,3)/2, np.power(dt,2)]])

# Variance
km.R = 1000

# Identity Matrix
I = np.array([[1, 0], [0, 1]])

# Measurement Matrix
km.Z = np.array(sma_predicted)

# Initial state
x = np.zeros((2,1))
x = np.array([[sma_predicted[0]], [0]])

# Initial distribution state's covariance matrix
km.P = np.array([[1000, 0], [0, 1000]])

for i in range (0, len(sma_predicted) - 1):
    # Prediction
    new_x_col = np.dot(km.F, x[:, i]).reshape(2, 1)
    x = np.append(x, new_x_col, axis=1)
    km.P = km.F * km.P * km.F.T + km.Q

    # Correction
    K = np.dot(km.P, km.H.T) / (np.dot(np.dot(km.H, km.P), km.H.T) + km.R)
    x[:, -1] = x[:, -1] + np.dot(K, (km.Z[i + 1] - np.dot(km.H, x[:, -1])))
    #x[:, -1] = (x[:, -1] + K * (km.Z[i + 1] - km.H * x[:, -1])).reshape(2, i + 2)
    km.P = (I - K * km.H) * km.P

谢谢

第二个值得先攻击,所以我就这么做

你有这个:

x = np.array([[sma_predicted[0]], [0]])
for i in range (0, len(sma_predicted) - 1):
    new_x_col = np.dot(km.F, x[:, i]).reshape(2, 1)
    x = np.append(x, new_x_col, axis=1)
    # ...
在NumPy中,重复向同一数组追加总是不好的做法,因此请从以下内容开始:

x = np.zeros((2, len(sma_predicted)))
x[0, 0] = sma_predicted[0]
for i in range(len(sma_predicted) - 1):
    x[:, i+1] = np.dot(km.F, x[:, i])
    # ...
注意:由于NumPy广播,不需要
重塑(2,1)

我知道这并不能回答你所有隐含的问题,但也许它能让你开始


如果
dot
ufunc
那就太好了,这样我们就可以做类似于
np.dot.outer(km.F,x.T)
,但它不是(见),所以我们不能。您可以使用Numba实现更多的加速(如我所示,删除
append()
,您的代码是Numba的一个很好的候选者)。

谢谢,@JohnZwinck,如果我这样做
x[:,I+1]=np.dot(km.F,x[:,I])
,我会对循环结束时的最终
x
值产生问题,因为它会突然丢失它的(2,1)形状变为(2,)形状。它确实可以更快地执行该循环,但对于这个问题,它对我不起作用。有什么办法可以解决这个问题吗?尽管我之前的评论是@JohnZwinck,我还是忘了在下面几行中更新
x
中使用的索引。现在,该循环大约在6秒钟内运行。谢谢