numpy矢量化python循环

时间:2018-06-21 18:33:19

标签: numpy vectorization

这是使用Keras库创建模型的代码片段:

    for state, action, reward, next_state, done in minibatch:
        target = reward
        if not done:
            target = (reward + self.gamma *
                      np.amax(self.model.predict(next_state)[0]))
        target_f = self.model.predict(state)
        #print (target_f)
        target_f[0][action] = target
        self.model.fit(state, target_f, epochs=1, verbose=0)

我正在尝试将其向量化。我认为要做的唯一方法是: 1.创建一个numpy表,每行=(状态,操作,奖励,next_state,完成,目标)。因此,将有“小批量”行数。 2.根据其他列将目标列更新为(使用掩码数组):

target[done==True] ==reward
target[done==False] == reward + self.gamma 
*np.amax(self.model.predict(next_state)[0])
  1. 现在更新self.model.fit(state,target_f,epochs = 1,verbose = 0)

NB:状态为8-D,所以状态向量有8个元素。

尽管付出了数小时的努力,但我仍然无法对此进行正确编码。 实际上可以对这段代码进行矢量化处理吗?

1 个答案:

答案 0 :(得分:2)

您非常亲密!假设minibatchnp.array

首先找到done为真的所有索引。假设done是索引号4。

minibatch_done=minibatch[np.where(minibatch[:,4]==True)]
minibatch_not_done=minibatch[np.where(minibatch[:,4]==False)]

现在,我们使用它来有条件地更新minibatch矩阵。假设索引2为reward,索引3为next_state

target=np.empty((minibatch.shape[0]))
target=minibatch_done[:,2]+self.gamma*np.amax(self.model.predict(minibatch_done[:,3]))
target=minibatch_not_done[:,2]

在那里,你有:)