LSTM构建特征的向量空间使用队列的方法

'''构建特征的向量空间'''
#建立个队列,先进先出

mem_num=1
pre=4
from collections import  deque
deq=deque(maxlen=mem_num)

X=[]
for i in sca_X:
    deq.append(list(i))
    if len(deq)==mem_num:
        X.append(list(deq))
        print(X)
X_lately=X[-pre:]
X=X[:-pre]
print(len(X))  #这个少的数量与mem——num是有关系的,
print(len(X_lately))   #2 跟shift的值有关系

不是很理解这段代码为什么前后的X长度会变化,经过队列之后的X的长度比原本少mem_NUM-1

基于Monster 组和GPT的调写:

  • 这段代码是在构建特征的向量空间时使用的。通过使用队列(deque),可以实现先进先出的数据结构。代码中的变量mem_num表示队列的长度,即记忆的数量。变量pre表示预测的数量。
  • 首先,代码创建了一个空的队列deq,并设置其最大长度为mem_num。然后,代码遍历sca_X列表,将每个元素转换为列表并添加到队列中。当队列的长度达到mem_num时,将队列的副本添加到列表X中,并打印出来。
  • 接下来,代码将X列表中的最后pre个元素提取出来,赋值给X_lately变量。然后,X列表被重新赋值为除去最后pre个元素之外的部分。
  • 在这段代码中,X的长度会减少mem_num-1,因为每当队列的长度达到mem_num时,会将队列的副本添加到X列表中。由于队列的长度是mem_num,所以每次添加后,X列表的长度减少了mem_num-1。
  • 例如,如果mem_num为1,原始的X列表长度为5,那么经过队列处理后,X列表的长度将变为4,因为每次添加一个元素后,会将前面的元素移除,只保留最后添加的元素。这样可以保持队列的长度不超过mem_num。

在上述代码中,当 mem_num 成功满足后,每当我们向 deque 中添加一个新元素,deque 会自动从头部删除一个元素,以使 deque 的长度恒定为 mem_num。 同时,该被删除的元素不能作为下一个mem_num长的序列的一部分,并且已经添加到 X 中。这解释了为什么在完成队列操作之后,会少 mem_num-1 行数据。

具体来看,在 looop 中首次执行添加到 X 前,列表 deq 是空的,因此我们没有添加任何内容到 X。无论迭代多少次,只有在长度为 mem_num 时,才会放入完整的 n-timesteps 数组(由于我们将其转换为一个列表)到 X 中。

例如,假设我们有以下散列值:[1,2,3,4,5,6,7,8,9]。并且设置了 mem_num=3。下面是数字插入到 deque 中的迭代:

第一步:deque([1])

第二步:deque([1, 2])

第三步:deque([1, 2, 3]) -> X.append(list(deq))

在第三步之后,X 包含一个数组即 [[1,2,3]],并且 deque 删除了其从头部开始的某个元素,现在大小为 2.最终结果,我们创建的 X 少mem_num-1的原因就是缺少填满 deque 前部的第一个 mem_num-1 个元素。

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:

这段代码中,通过使用Python中的collections模块中的deque双端队列来构建特征的向量空间。队列是一种数据结构,具有先进先出(FIFO)的特点,可以将数据按照一定顺序进行排列,并可以方便地进行添加、删除等操作。

具体地,这段代码中,首先通过deque(maxlen=mem_num)创建了一个最大长度为mem_num的双端队列deq。接着,将sca_X中的每个元素(假设sca_X是一个二维列表)转换为列表,并将其添加到deq中。当deq的长度达到mem_num时,将deq中的元素转换为列表,并添加到列表X中。注意,由于X是一个列表,所以每次添加的元素也是一个列表。

最后,将X中的后pre个元素(即最近加入的pre个元素)赋给X_lately,将X中除了最后pre个元素之外的所有元素赋给X。因此,X的长度减少了pre,而X_lately的长度恰好为pre。

具体来说,如果mem_num=1,即每次只添加一个元素到队列中,那么X中的每个元素也只包含一个元素。而如果mem_num大于1,每次添加的元素是一个列表,因此X中的每个元素也是一个列表,其长度等于mem_num。由于最后赋给X_lately的是X中的后pre个元素,因此X的长度减少了pre,而X_lately的长度为pre。

如果你在使用这段代码时发现长度计算不正确,可以检查mem_num和pre的值是否正确,以及sca_X是否包含了足够的数据。

如果以上回答对您有所帮助,点击一下采纳该答案~谢谢