【问题标题】:Convert dict to array in NumPy在 NumPy 中将字典转换为数组
【发布时间】:2011-01-14 12:59:30
【问题描述】:

我想获取一个包含浮点数的字典,由整数索引并将其转换为 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() ) ) )

我希望有人可能知道可以将 dict 的 dict 转换为数组的灵丹妙药。

【问题讨论】:

  • 我不清楚你到底从什么开始和想以什么结束。
  • 很抱歉造成混乱。
  • 所以您使用字典作为稀疏数组,并希望将它们转换为 numpy 数组,对吧?
  • 是的,完全正确。不能保证数据库中包含的索引跨度为 1 到 N
  • 指数总是非负数吗?

标签: python arrays dictionary numpy


【解决方案1】:

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

稀疏数组有various options。例如,

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 这将很快导致问题。我应该放置我当前使用的代码。
  • @Oxinabox。谢谢,已修复。
【解决方案2】:

假设您有一个 NxM 数组,那么我将执行以下操作:

myarray = numpy.zeros((N, M))
for key1, row in mydict.iteritems():
   for key2, value in row.iteritems():
       myarray[key1, key2] = value 

【讨论】:

  • 这也可以写成一个列表推导式,尽管它可能包含太多内容而难以理解。
  • 在列表理解的情况下,您首先创建一个大列表。在这种情况下,您可以绕过它,从而减少内存使用量。看你喜欢。
猜你喜欢
  • 2018-05-28
  • 2019-05-29
  • 2020-09-16
  • 1970-01-01
  • 2020-08-22
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 2021-05-15
相关资源
最近更新 更多