在NumPy中将字典转换为数组

5
我想将一个包含浮点数的字典的字典转换为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

我希望只有一个多维浮点数数组,而不是一个字典数组。
编辑:
抱歉耽搁了。这是我用来创建仅包含值的第一个数组对象的代码:
storedArray = numpy.asarray( reduce( lambda x,y: x + y, (item.values() for item in storedMapping.values() ) ) )

我希望有人能够知道一个神奇的方法,可以将字典中的字典转换为数组。

我不清楚你具体从哪里开始,想要达到什么目标。 - Mike Graham
抱歉造成困惑。 - wheaties
所以你正在使用字典作为稀疏数组,并希望将它们转换为numpy数组,对吗? - Dave Kirby
是的,确实如此。数据库中包含的索引并不保证跨越1到N。 - wheaties
1
索引值是否总是非负的? - John La Rooy
稍微有点被拉走了。是的,索引始终为非负数。 - wheaties
2个回答

4
你可以像这样计算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 

我正在看这个,基本上看起来像是手动展开一个稀疏数组表示到全零表示。如果M,N = 10^6,这会很快引起问题。我应该放置我目前正在使用的代码。 - wheaties
@Oxinabox。谢谢,已修复。 - John La Rooy

1
假设你有一个NxM的数组,那么我会执行以下操作:
myarray = numpy.zeros((N, M))
for key1, row in mydict.iteritems():
   for key2, value in row.iteritems():
       myarray[key1, key2] = value 

1
这也可以写成列表推导式,但可能太复杂了,不容易理解。 - pwdyson
在列表推导式的情况下,您首先创建一个大的列表。在这种情况下,您可以绕过这一点,从而减少内存使用量。这取决于您的喜好。 - bayer

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