列表python中每个唯一元素的所有索引
Posted
技术标签:
【中文标题】列表python中每个唯一元素的所有索引【英文标题】:All indices of each unique element in a list python 【发布时间】:2016-11-02 17:57:21 【问题描述】:我正在处理一个非常大的数据集(大约 7500 万个条目),并且我正在尝试显着缩短运行我的代码所花费的时间(现在有一个循环需要几个天)并保持极低的内存使用率。
我有两个长度相同的 numpy 数组(clients
和 units
)。我的目标是获取一个值出现在我的第一个列表 (clients
) 中的每个索引的列表,然后在每个索引处找到我的第二个列表中的条目总和。
这是我试过的(np
是之前导入的numpy库)
# create a list of each value that appears in clients
unq = np.unique(clients)
arr = np.zeros(len(unq))
tmp = np.arange(len(clients))
# for each unique value i in clients
for i in range(len(unq)) :
#create a list inds of all the indices that i occurs in clients
inds = tmp[clients==unq[i]]
# add the sum of all the elements in units at the indices inds to a list
arr[i] = sum(units[inds])
有没有人知道一种方法可以让我在不遍历unq
中的每个元素的情况下找到这些总和?
【问题讨论】:
熊猫会是你的选择吗? 熊猫总是一种选择。 我正在使用 pandas 上传和下载数组,还有其他方法可以使用吗? 【参考方案1】:使用Pandas,这可以使用grouby()
函数轻松完成:
import pandas as pd
# some fake data
df = pd.DataFrame('clients': ['a', 'b', 'a', 'a'], 'units': [1, 1, 1, 1])
print df.groupby(['clients'], sort=False).sum()
给你想要的输出:
units
clients
a 3
b 1
我使用 sort=False
选项,因为这可能会加快速度(默认情况下,条目将被排序,这对于庞大的数据集可能需要一些时间)。
【讨论】:
非常感谢!这太棒了! @downvoter:你能解释一下你的反对意见吗?是因为这是一个 numpy 而不是 pandas 的问题吗?然后您可以查看我询问是否可以选择 pandas 的问题下方的 cmets... 如果还有其他问题,请指出!【参考方案2】:这是一个典型的 group-by 类型操作,可以使用 numpy-indexed 包优雅高效地执行(免责声明:我是它的作者):
import numpy_indexed as npi
unique_clients, units_per_client = npi.group_by(clients).sum(units)
请注意,与 pandas 方法不同,无需创建临时数据结构来执行此类基本操作。
【讨论】:
有趣。没听说过这个包。任何想法如何扩展到我上面添加的熊猫解决方案?显然,有人并不真正喜欢它,但更喜欢你的解决方案,所以我想知道你的解决方案是否确实更有效率...... :) 我想它们在性能方面是相似的。然而,从概念上讲,pandas 对于这种基本操作来说是一个严重的依赖项。作为阅读 pandas 解决方案的人,我可能想知道数据框是什么,以及它与分组有什么关系;答案基本上是“什么都没有”。以上是关于列表python中每个唯一元素的所有索引的主要内容,如果未能解决你的问题,请参考以下文章
For循环将列表的所有元素放入不同的文本文件中,而不是在python中遍历每个元素