【问题标题】:Converting a dictionary to numpy matrix in python在python中将字典转换为numpy矩阵
【发布时间】:2015-11-18 03:52:12
【问题描述】:

我是 python 初学者。我有一本像下面这样的字典:

{'Clinton': [{'ideology': -0.5, 'vote':80}, {'ideology': -0.75, 'vote':90},
 {'ideology': -0.89, 'vote': 99}, 
{'ideology': -0.5, 'vote':80, 'review': "She is a presidential candidate"}],
 'Alexander': [{'ideology': -0.1, 'vote':50}, {'ideology': -0.95, 'vote':20}, 
{'ideology': -0.19, 'vote': 19}, {'ideology': -0.2, 'vote':30, 'review': "Good"}] 
... }

我想将此字典转换为 numpy 矩阵,就像将名称创建为一列一样,例如:

   Name  ideology vote review
  Clinton  -0.5    80
  Clinton  -0.75   90
  Clinton  -0.89   99
  Clinton  -0.5    80   "She is a presidential candidate"
 Alexander -0.1    50
 Alexander -0.95   20
 Alexander -0.19   19
 Alexander -0.2    30   "Good"

如何将此字典转换为 numpy 矩阵?

我遇到的一个问题是数据有超过一百万个观察值。因此,循环遍历它将永远花费时间。我想将字典用作岭回归的特征向量。

【问题讨论】:

  • 值得一提的是:Pandas 可以轻松地从 dict 创建 DataFrame。
  • 但除了 Pandas:您是否尝试过创建一个空的结构化数组并在 dict 和内部列表上使用循环来填充数组?
  • @Evert 我试过了,但问题是数据有超过百万的观察值。因此,循环遍历它将永远花费时间。我想将字典用作岭回归的特征向量!
  • 在这种情况下你应该考虑熊猫。
  • 另一件事。这可能是 XY 问题的情况,因为我猜您的数据不是从字典开始的。它从哪里来的?数据库、CSV 文件还是其他地方?

标签: python numpy dictionary matrix


【解决方案1】:

由于您的数据来自json 文件,您可以使用read_json() 函数将其加载到Pandas 中。这将创建一个包含您想要的列的数据框。要运行岭回归,您可以使用 scikit learn 中的 Ridge 类(更多信息 here)。作为 Python 初学者,值得学习 pandas 和 scikit。它们是用于数据分析和挖掘的流行软件包,将为您提供所需的大部分工具。结合两个网站上的例子:

from sklearn.linear_model import Ridge
import pandas
df = pandas.read_json('json.gz')
y = df['vote']
X = df['ideology']
clf = Ridge(alpha=1.0)
clf.fit(X, y)

这只是一个粗略的例子。我可能翻转了您的 x 轴和 y 轴,并弄错了所有配置。您可能需要通过pandas.read_json() 的orient 参数提供格式字符串。话虽如此,这应该让您了解如何在阅读相关文档后开始使用。

【讨论】:

    【解决方案2】:

    这是一个开始。我现在不担心速度(Ipython with python3.4)

    In [473]: dd = {'Clinton': [{'ideology': -0.5, 'vote':80}, {'ideology': -0.75, 'vote':90},
     {'ideology': -0.89, 'vote': 99}, 
    {'ideology': -0.5, 'vote':80, 'review': "She is a presidential candidate"}],
     'Alexander': [{'ideology': -0.1, 'vote':50}, {'ideology': -0.95, 'vote':20}, 
    {'ideology': -0.19, 'vote': 19}, {'ideology': -0.2, 'vote':30, 'review': "Good"}]}
    ...
    In [475]: dd
    Out[475]: 
    {'Alexander': [{'ideology': -0.1, 'vote': 50},
      {'ideology': -0.95, 'vote': 20},
      {'ideology': -0.19, 'vote': 19},
      {'ideology': -0.2, 'vote': 30, 'review': 'Good'}],
     'Clinton': [{'ideology': -0.5, 'vote': 80},
      {'ideology': -0.75, 'vote': 90},
      {'ideology': -0.89, 'vote': 99},
      {'ideology': -0.5, 'vote': 80, 'review': 'She is a presidential candidate'}]}
    In [476]: dd.keys()
    Out[476]: dict_keys(['Alexander', 'Clinton'])
    In [478]: dd.values()
    Out[478]: dict_values([[{'ideology': -0.1, 'vote': 50}, {'ideology': -0.95, 'vote': 20}, {'ideology':....}]])
    ...
    

    要创建一个记录数组,我需要一个元组列表,每个元组都有每个字段的值。具有键值对的第一条记录。但值是一个列表。

    (这些值列表显然是使用带有列表追加的默认字典的结果。这是构建字典的好方法,但不幸的是,对于数组,我们必须解包它。)

    In [480]: [(k,v) for k,v in dd.items()]
    Out[480]: 
    [('Alexander',
      [{'ideology': -0.1, 'vote': 50},
       {'ideology': -0.95, 'vote': 20},
       ....
        'review': 'She is a presidential candidate'}])]
    

    更好 - 具有 3 个字段的元组列表列表:

    In [483]: [[(k,vv['ideology'],vv['vote']) for vv in v] for k,v in dd.items()]
    Out[483]: 
    [[('Alexander', -0.1, 50),
      ('Alexander', -0.95, 20),
      ('Alexander', -0.19, 19),
      ('Alexander', -0.2, 30)],
     [('Clinton', -0.5, 80),
      ('Clinton', -0.75, 90),
      ('Clinton', -0.89, 99),
      ('Clinton', -0.5, 80)]]
    

    添加可能缺少的review 字段

    In [484]: [[(k,vv['ideology'],vv['vote'],vv.get('review','')) for vv in v] for k,v in dd.items()]
    Out[484]: 
    [[('Alexander', -0.1, 50, ''),
      ('Alexander', -0.95, 20, ''),
      ('Alexander', -0.19, 19, ''),
      ('Alexander', -0.2, 30, 'Good')],
     [('Clinton', -0.5, 80, ''),
      ('Clinton', -0.75, 90, ''),
      ('Clinton', -0.89, 99, ''),
      ('Clinton', -0.5, 80, 'She is a presidential candidate')]]
    In [485]: ll=[[(k,vv['ideology'],vv['vote'],vv.get('review','')) for vv in v] for k,v in dd.items()]
    

    要展平列表中的列表,请使用 intertools 链

    In [486]: from itertools import chain
    ...
    In [488]: list(chain(*ll))
    Out[488]: 
    [('Alexander', -0.1, 50, ''),
     ('Alexander', -0.95, 20, ''),
     ('Alexander', -0.19, 19, ''),
     ('Alexander', -0.2, 30, 'Good'),
     ('Clinton', -0.5, 80, ''),
     ('Clinton', -0.75, 90, ''),
     ('Clinton', -0.89, 99, ''),
     ('Clinton', -0.5, 80, 'She is a presidential candidate')]
    In [489]: ll1=list(chain(*ll))
    ...
    

    定义数据类型:

    In [491]: dt=np.dtype([('name','U10'),('ideology',float),('vote',int),('review','U100')])
    
    In [492]: data=np.array(ll1,dt)
    In [493]: data
    Out[493]: 
    array([('Alexander', -0.1, 50, ''), ('Alexander', -0.95, 20, ''),
           ('Alexander', -0.19, 19, ''), ('Alexander', -0.2, 30, 'Good'),
           ('Clinton', -0.5, 80, ''), ('Clinton', -0.75, 90, ''),
           ('Clinton', -0.89, 99, ''),
           ('Clinton', -0.5, 80, 'She is a presidential candidate')], 
          dtype=[('name', '<U10'), ('ideology', '<f8'), ('vote', '<i4'), ('review', '<U100')])
    

    看起来不错。在最后一个数组创建步骤中没有迭代。将字典转换为元组列表时存在迭代。但在使用字典时,这种迭代是不可避免的。

    【讨论】:

      猜你喜欢
      • 2012-05-24
      • 2021-11-25
      • 2016-11-05
      • 1970-01-01
      • 1970-01-01
      • 2021-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多