Я хотел бы взять словарь словаря, содержащего плавания, индексированные ints и преобразовать его в 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
Я хотел бы иметь просто многомерный массив плаваний, не массив dicts.
Править:
Извините за задержку. Вот код, который я использовал для создания первого объекта массива, содержащего просто значения:
storedArray = numpy.asarray( reduce( lambda x,y: x + y, (item.values() for item in storedMapping.values() ) ) )
Я надеялся, что кто-то мог бы знать чудодейственное средство, которое могло преобразовать dict dict в массив.
Вы можете вычислить 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
Допустим, у вас есть массив NxM, тогда я бы сделал следующее:
myarray = numpy.zeros((N, M))
for key1, row in mydict.iteritems():
for key2, value in row.iteritems():
myarray[key1, key2] = value