Python 使用其中一列中的值作为键创建数组字典

Python 使用其中一列中的值作为键创建数组字典,python,arrays,numpy,dictionary,Python,Arrays,Numpy,Dictionary,我已经尝试了一段时间,但迄今为止几乎没有成功。我在python中有一个大的(>400000个数据点)2D数组。数组本身可以根据日期(dd\mm\yyyy)拆分为一系列较小的行 为了实现我的最终目标,我想做的一件事是将numpy.ndarray(类似于下面可以看到的,但显然要大得多)更改为键字典(一个用于一个月的每一天)和相应的数组(包括每个特定天的所有原始数组数据) 我不知道如何使上面的数组以与我导入的数组相同的代码格式显示,但正如我所提到的,它应该显示为numpy.ndarray 我有一段代码

我已经尝试了一段时间,但迄今为止几乎没有成功。我在python中有一个大的(>400000个数据点)2D数组。数组本身可以根据日期(dd\mm\yyyy)拆分为一系列较小的行

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

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

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

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

如果您需要更多信息,请直接询问,我将尽力提供所需的任何信息。我对这一切都相当陌生。

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

v = row[1:]
请注意,您可以将其简化为

y[row[0]] = row[1:]
事实上,整个循环可以作为口述理解来完成:

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

只需使用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:])

创建一个数组只是为了创建一个dict是没有意义的,如果您想要一个dict,只需如上所述创建dict。

'16/06/2015 00:00''卡片“Smith”“John”“Full Time”
计算为单个字符串
'16/06/2015 00:00cardSmithJohnFull Time'
。是否考虑到了这一点?当我从文本生成数组时,'delimiter=“\t”'不应该考虑到这一点吗?@TigerhawkT3,这是一个numpy数组,所以它不是一个stringOK;我不确定它是numpy结构、纯Python结构还是伪代码。@TigerhawkT3,
Array1=np.genfromtxt(……
Hi,@Daniel Roseman,谢谢你的回复!我已经按照你的建议做了,它会清除错误,所以非常感谢你的帮助!但是,当我调用特定的键时(例如“print y”)['16/06/2015 00:00']”,它似乎只返回其中一个数据点,而不是与该列值关联的整个数据点列表。您对可能发生这种情况的原因有何建议?您好@Padraic Cunningham,感谢您的回复!我收到一个错误“'AttributeError:'str'对象没有属性'extend'”。你知道为什么会出现这种情况吗?谢谢。@Jamie,别担心,如果你想让每一行彼此分开,你可以附加而不是扩展,扩展会给你一个简单的值列表,你可能想要它,也可能不想要它。谢谢你的洞察力!我已经成功地让我的程序正常运行了!:D
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:])