2014-09-19 2 views
2

У меня есть словарь Python 3, содержащий очень длинные списки (по 30 миллионов целых чисел). Я хотел бы сшить все эти списки в один массив numpy. Как я могу это сделать эффективно?Включить словарь списков в массив 1D numpy

Следующая

np.array(my_dict.values()) 

, кажется, не работает (я получаю array(dict_values([[...], [....])) в отличие от плоского массива Numpy 1D).

+1

в Python 3 просто выполните 'np.array (list (my_dict.values ​​())). Flatten()' –

ответ

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.]]) 
+0

Это создает многомерный массив, а не 1d-массив по запросу OP –

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

+1, если он не нужен любой порядок, основанный на ключах, был самым быстрым подходом. –

+1

'list (chn)' имеет больше смысла, чем '[x for x in chn]'. Это тоже быстрее. – Veedrac

2

Если вы ищете плоский 1d массив, вы можете использовать только 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]) 
+0

не будет работать с использованием python 3, вам понадобится 'list (d.values ​​())' –

1

Для того, чтобы получить упорядоченные конкатенации на основе ключей:

np.array([d[k] for k in sorted(d.keys())]).flatten() 

, если вам не нужен какой-либо порядок, основанный на ключах подхода @Padraic Каннингема был самой быстрой на основе моих таймингов здесь ...

Смежные вопросы