将稀疏格式转换为数组numpy

时间:2012-10-01 20:30:57

标签: python arrays numpy

假设您有一个返回表行的生成器。你可以用这样的东西:

for (labels, value) in rows:
    pass

“labels”的长度为n,并且为了简单起见,它是所有字符串。 “价值”是像浮动一样的数字。

是否有快速,最佳或内置的方式来对标签进行散列并最终得到一个n维数组值和n个列表,告诉您如何将标签值映射到索引?我想你可以将它存储在一个重新组合中?我一直这样做,但它总是会丢掉一些代码。我想找到或创造更可重用的东西。

我会很高兴 (('here', 'there', 'nowhere'), 1.234)被映射到results['here']['there']['nowhere'] = 1.234results[12,3,45] = 1.234(并且在每个维度的轴下都有相应的列表。)

我可能会将生成器转换为稀疏格式并使用scipy,但这似乎是一种相当简单的令人讨厌的方法。

我看到很多类似的问题,但没有一个能够完全回答这个问题。也许我错过了一个搜索短语。

1 个答案:

答案 0 :(得分:0)

您可以尝试使用结构化数组:

result = np.fromiter(your_generator, dtype=[('labels', '|S10'), ('value', float)])

您可以将ndarray个标签检索为result['labels'](当然,值为result['value'])。

请注意,您可以在同一标签中存储多个条目(前提是您的号码始终相同),例如

result = np.array([(('a','b','c'), 1.23),(('a','c','d'), 2.34)],
                  dtype=[('label', ("|S10", 3)), ('value', float)])

其中每个单独的记录作为元组给出,并且记录的三个“标签”作为元组本身给出。您还可以使用定制的dtype单独命名每个“标签”,例如:

 dtype=[('label',[('A','|S10'),('B','|S10'),('C','|S10')]),('value',float)]

这样,您就可以访问所有Aresult['label']['A'] ...