Конвертировать dict в массив в NumPy - PullRequest
5 голосов
/ 08 февраля 2010

Я хотел бы взять словарь из словаря, содержащего числа с плавающей запятой, проиндексированные по целым числам и преобразовать его в массив numpy.array для использования с библиотекой numpy. В настоящее время я вручную конвертирую значения в два массива, один для исходных индексов, а другой для значений. Пока я смотрел на numpy.asarray, я пришел к выводу, что, должно быть, я что-то не так делаю. Может кто-нибудь показать пример того, как правильно преобразовать такое творение? Не нужно использовать numpy.asarray, все подойдет.

from collections import defaultdict
foo = defaultdict( lambda: defaultdict(float) )
#Then "foo" is populated by several
#routines reading results from a DB
#
#As an example
foo[ 7104 ][ 3 ] = 4.5
foo[ 203 ][ 1 ] = 3.2
foo[ 2 ][ 1 ] = 2.7

Мне бы хотелось иметь только многомерный массив с плавающей точкой, а не массив диктов.

Edit:

Извините за задержку. Вот код, который я использовал для создания первого объекта массива, содержащего только значения:

storedArray = numpy.asarray( reduce( lambda x,y: x + y, (item.values() for item in storedMapping.values() ) ) )

Я надеялся, что кто-то может знать магическую пулю, которая может преобразовать диктовку в массив.

Ответы [ 2 ]

4 голосов
/ 08 февраля 2010

Вы можете рассчитать N и M следующим образом

N=max(foo)+1
M=max(max(x) for x in foo.values())+1
fooarray = numpy.zeros((N, M))
for key1, row in foo.iteritems():
   for key2, value in row.iteritems():
       fooarray[key1, key2] = value 

Есть различные опции для разреженных массивов. Например,

import scipy.sparse
foosparse = scipy.sparse.lil_matrix((N, M))
for key1, row in foo.iteritems():
   for key2, value in row.iteritems():
       foosparse[(key1, key2)] = value 
1 голос
/ 09 февраля 2010

Скажем, у вас есть массив NxM, тогда я бы сделал следующее:

myarray = numpy.zeros((N, M))
for key1, row in mydict.iteritems():
   for key2, value in row.iteritems():
       myarray[key1, key2] = value 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...