列表python中每个唯一元素的所有索引

Posted

技术标签:

【中文标题】列表python中每个唯一元素的所有索引【英文标题】:All indices of each unique element in a list python 【发布时间】:2016-11-02 17:57:21 【问题描述】:

我正在处理一个非常大的数据集(大约 7500 万个条目),并且我正在尝试显着缩短运行我的代码所花费的时间(现在有一个循环需要几个天)并保持极低的内存使用率。

我有两个长度相同的 numpy 数组(clientsunits)。我的目标是获取一个值出现在我的第一个列表 (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中遍历每个元素

怎么查找python列表中元素的位置

SQL中unique作用是啥

python之enumerate函数:获取列表中每个元素的索引和值

Python3 - 列表