在Python中将队列转换为列表/数组

21

我正在运行多个线程,并在队列中收集它们的结果。我希望将其转储到数组或列表中,以便可以进行索引并检索这些结果。队列中的每个元素都是具有n维的数组。我想访问这些数组。请问我该如何做?

 def dump_queue(model_queue):
 queue_list = []
 for i in iter(model_queue.get,'STOP'):
         queue_list.append(i)
  return queue_list




aux_model=train_svm(np.array(trainExample),np.array(trainLabel))
model_queue.put(aux_model.coef_)

因此,数组是svm的学习模型参数。model_queue在线程之间共享。我想访问每个模型参数向量,而不是每个模型参数条目。


1
你需要更加具体一些。这些队列是什么类型的?(Python 队列,AMQP,STOMP)队列中的信息如何表示?(JSON、XML、Yaml、Python 对象)此外,您是否有一些已经尝试过但未成功的代码?您打算如何索引这些数组? - Gabriel Samfira
嗨,Gabriel,我已经尝试让问题更具体了。 - thetna
4个回答

54

你已经完成了并行部分,只想以列表形式获得结果,是这样吗?那么尝试使用:

list(my_queue.queue)

例子:

from queue import Queue

q = Queue()
for i in range(5):
    q.put(i)

l = list(q.queue)
print(l)

输出:

[0, 1, 2, 3, 4]

@AkshayLAradhya 我刚在Python 3.6.5中测试了一下,它可以正常工作。你使用的是相同的导入吗? - grovina
1
抱歉,我的错。我以为这是用于“multiprocessing.Queue”的。 - DollarAkshay
7
为了充分披露,我认为应该指出Queue.queue属性没有记录,尽管它似乎不是私有的,因为它没有前导下划线 _ 字符,这使得它的状态至少有点模糊不清,在我看来,换句话说,它似乎只是一个“实现细节”... - martineau
2
这会将项目留在队列中还是将它们删除? - ed22

7

不确定是否是同样的问题,但我需要做同样的事情,最终写了这个。我正在使用python 2.7中的threading.Thread和Queue对象,并且只想将队列转储到列表中。

def queue_to_list(q):
    """ Dump a Queue to a list """

    # A new list
    l = []

    while q.qsize() > 0:
        l.append(q.get())
    return l

1
我会选择以下解决方案:
from collections import deque
q = deque()
for i in range(5):
    q.append([i,i+10])
listed_q = list(q)

现在您可以通过索引或切片轻松访问这些值:
print listed_q[1]        # [1, 11]
print listed_q[1][1]     # 11

由于list()会创建q的副本,因此您应该注意队列的维度。这个操作所需的时间会随着队列长度的增加而增加。另一种方法是使用itertools.islice,在将结果存储在列表中之前先对队列进行切片。请查看以下链接(性能测量也在其中): 使用collections.deque中的切片符号 如何对deque进行切片?[重复]

1

就像Gabriel所说的,你应该明确你的问题。

当你谈论数组时,我认为你是指列表。Python数组用于存储数值。

然而,你可以将你的队列转换为一个嵌套列表:#输出列表:

collectedData = list()
# # # 
# for every thread, call:
threadBuffer = [item for item in q.queue]
collectedData.append(threadBuffer)

这将把您的数据收集到嵌套列表中,您可以像这个例子一样轻松访问它们:
l = list()
l.append([1,2,3,4,5,6,7,9,10])
l.append([6,7,8,9,0,11,22,33])

现在您可以自由访问: l[1][2] -> 8

这对您有帮助吗?

最好的问候,Christian


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接