【发布时间】:2017-07-10 20:33:50
【问题描述】:
由于 collections.Counter 太慢了,我正在寻求一种更快的方法来在 Python 2.7 中对映射值求和。这似乎是一个简单的概念,我对内置的 Counter 方法有点失望。
基本上,我需要能够接受这样的数组:
array([[ 0., 2.],
[ 2., 2.],
[ 3., 1.]])
array([[ 0., 3.],
[ 1., 1.],
[ 2., 5.]])
然后“添加”它们,使它们看起来像这样:
array([[ 0., 5.],
[ 1., 1.],
[ 2., 7.],
[ 3., 1.]])
如果没有快速有效地做到这一点的好方法,我愿意接受任何其他可以让我做类似事情的想法,并且我愿意接受 Numpy 以外的模块。
谢谢!
编辑:准备好进行一些速度测试了吗? Intel win 64bit 机器。以下所有值均以秒为单位; 20000 个循环。
collections.Counter 结果: 2.131000, 2.125000, 2.125000
Divakar 的 union1d + 掩蔽结果: 1.641000, 1.633000, 1.625000
Divakar 的 union1d + 索引结果: 0.625000, 0.625000, 0.641000
直方图结果: 1.844000, 1.938000, 1.858000
熊猫结果: 16.659000, 16.686000, 16.885000
结论:union1d + 索引获胜,数组大小太小,Pandas 无法发挥作用,直方图方法的简单性让我大吃一惊,但我猜创建它需要太多开销。不过,我收到的所有回复都非常好。 This is what I used to get the numbers. 再次感谢!
编辑:应该提到的是,尽管做了同样的事情(65.671000 秒),但使用 Counter1.update(Counter2.elements()) 还是很糟糕。
稍后编辑:我一直在考虑这个问题,并且我开始意识到,使用 Numpy,用零填充每个数组可能更有效,这样第一个column 甚至不需要,因为我们可以只使用索引,这也使得将多个数组添加在一起以及执行其他功能变得更加容易。此外,Pandas 比 Numpy 更有意义,因为不需要填充 0,而且对于大型数据集肯定会更有效(但是,Numpy 具有在更多平台上兼容的优势,比如 GAE,如果这很重要的话完全)。最后,我检查的答案绝对是我提出的确切问题的最佳答案——以我展示的方式添加两个数组——但我认为我需要的是改变观点。
【问题讨论】:
-
为什么结果有4行?
-
因为结果的行数等于数组所有第一索引联合中唯一第一索引的数量。由于在顶部数组中,只有顶部的数组有“2”,只有中间的数组有“3”,所以底部的数组同时有 2 和 3。
-
你知道第一列的最大值是多少吗?
-
是的,假设我知道数字范围。对于我正在做的事情,这些数字将是一种 ID。
-
出于好奇,你到底在用
collections.Counter做什么?
标签: python arrays numpy multidimensional-array counter