将列表字典转换为一维numpy数组

5
我可以为您提供翻译帮助。以下是需要翻译的内容:

我有一个包含非常长列表的Python 3字典(每个列表有3000万个整数)。我想将所有这些列表拼接成一个单一的numpy数组。如何 高效地 实现这一点?

以下是

np.array(my_dict.values())

看起来不起作用(我得到一个array(dict_values([[...], [....])),而不是一个扁平的1D numpy数组)。


3
在Python 3中,只需执行np.array(list(my_dict.values())).flatten()即可。 - Saullo G. P. Castro
5个回答

9
如果您正在寻找一个平坦的一维数组,您可以使用 np.concatenate:
>>> d = {'a': [1, 2, 3, 4, 5], 'b': [1, 2, 3, 4, 5], 'c': [1, 2, 3, 4, 5]}
>>> np.concatenate(list(d.values()))
array([1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5])

6

试着这样做

list(my_dict.values())


(添加评论)

dict.values() 返回的是一个 view 而不是一个列表。 参考 此处


虽然这可能回答了作者的问题,但它缺少一些解释性的词语和文档链接。裸代码片段没有周围的一些短语是不太有帮助的。您也可以在如何撰写好的答案中找到很多帮助。请编辑您的答案。 - hellow

4
from itertools import chain
import numpy as np
chn = chain.from_iterable(d.values())
np.array(list(chn))

如果他不需要基于键的任何顺序,那么这是最快的方法。 - Saullo G. P. Castro
1
list(chn)比[x for x in chn]更有意义。而且它也更快。 - Veedrac
1
对于我来说(Python 3),np.array(list(chain(d.values()))) 可以工作。 - Markus Strauss

1

提前分配 numpy 数组:

my_dict = {0:[0,3,2,1], 1:[4,2,1,3], 2:[3,4,2,1]}
array = numpy.ndarray((len(my_dict), len(my_dict.values()[0]))

然后你可以像这样将它们插入到数组中:
for index, val in enumerate(my_dict.values()):
    arr[index] = val
>>> arr
array([[ 0.,  3.,  2.,  1.],
       [ 4.,  2.,  1.,  3.],
       [ 3.,  4.,  2.,  1.]])

这将创建一个多维数组,而不是OP请求的1d数组。 - Padraic Cunningham

1
为了基于键获得有序连接:
np.array([d[k] for k in sorted(d.keys())]).flatten()

如果您不需要按键排序,@Padraic Cunningham的方法在我的测试中是最快的...

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