【问题标题】:Creating a dictionary of arrays, using values in one of the columns as the key创建一个数组字典,使用其中一列中的值作为键
【发布时间】:2016-02-26 17:20:12
【问题描述】:

我已经尝试了一段时间,但到目前为止收效甚微。我在 python 中有一个大的(> 400,000 个数据点)二维数组。数组本身可以根据日期 (dd\mm\yyyy) 拆分为一系列较小的行。

为了实现我的最终目标,我想做的一件事是将一个 numpy.ndarray(类似于下面可以看到的,但显然更大)变成一个键字典(一个用于月)和相应的数组(由每个特定日期的所有原始数组数据组成)。

[['16/06/2015 00:00'    'card' 'Smith' 'John' 'Full Time']
['16/06/2015 00:00' 'card'  'Doe'   'Jane'  'Part Time']
['17/07/2015 00:00' 'card'  'Doe'   'Jane'  'Part Time']
['18/06/2015 00:00' 'card' 'Smith' 'John' 'Full Time']
['30/06/2015 00:00' 'card'  'Bob'   'Roberts'   'Full Time']
['30/06/2015 00:00' 'card'  'Smith' 'John'  'Full Time']
['30/06/2015 00:00' 'card'  'Bob'   'Roberts'   'Full Time']]

我不确定如何让上面的数组以与我正在导入的相同的代码格式显示,但正如我所提到的,它应该显示为 numpy.ndarray。

我有代码,您可以在下面看到,它返回错误“索引错误:用作索引的数组必须是整数(或布尔)类型”,这是一个问题,因为我拥有的数据是由字符串组成的.

Array1 = np.genfromtxt('PATH', delimiter="\t", dtype=(str))
y = {}
for row in Array1:
    v = Array1[row[1:]]
    k = row[0]
    y[k]=v

如果您需要更多信息,请尽管询问,我会尽力提供所需的任何信息。我对这一切都很陌生。

【问题讨论】:

  • '16/06/2015 00:00' 'card' 'Smith' 'John' 'Full Time' 计算为单个字符串 '16/06/2015 00:00cardSmithJohnFull Time'。是否考虑到这一点?
  • 当我从文本生成数组时,'delimiter="\t"' 是否应该考虑到这一点?
  • @TigerhawkT3,这是一个 numpy 数组,所以它不是单个字符串
  • 好的;不确定它是 numpy 结构、纯 Python 结构还是伪代码。
  • @TigerhawkT3, Array1 = np.genfromtxt(........

标签: python arrays numpy dictionary


【解决方案1】:

只需使用 csv 模块从文件中创建 dict 来解析它,您需要处理重复的键,例如 "16/06/2015 00:00",这可以使用 defaultdict 来完成,否则您将只有与键关联的最后一个值:

import csv
from collections import defaultdict
with open("infile") as f:
    d = defaultdict(list)
    for row in csv.reader(f, delimiter="\t"):
        row[0].extend(row[1:])

创建一个数组只是为了创建一个字典是没有意义的,如果你想要一个字典,只需像上面那样创建字典。

【讨论】:

  • 嗨@Padraic Cunningham,感谢您的回复!我收到一个错误“'AttributeError:'str' object has no attribute 'extend'”。你有什么想法为什么会弹出?谢谢。
  • @Jamie,不用担心,如果你想让每一行彼此分开,你可以追加而不是扩展,扩展会给你一个平面的值列表,可能是也可能不是你想要的
  • 感谢您的洞察力!我已经设法让我的程序正确运行! :D
【解决方案2】:

错误消息将指向循环的第一行:正如它所说,这不是您索引数组的方式。 row 已经是该行中的值列表;您已经知道如何通过row[0] 获取单个项目,并获得完全相同的列表:row[1:]。所以你的代码就是:

v = row[1:]

请注意,您可以将其简化为

y[row[0]] = row[1:]

事实上整个循环可以作为一个字典理解来完成:

y = {row[0]:row[1:] for row in Array1}

【讨论】:

  • 嗨,@Daniel Roseman,感谢您的回复!我已经按照您的建议做了,它清除了错误,非常感谢您的帮助!但是,当我调用特定键(例如“print y['16/06/2015 00:00']”时,它似乎只返回一个数据点,而不是与该列值关联的整个数据点列表. 对于为什么会发生这种情况,您有什么建议吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-14
  • 2016-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 2021-07-12
相关资源
最近更新 更多