迭代两个或多个列表/ numpy数组......并将每个项目相互比较并避免在python中循环

时间:2012-10-30 16:03:24

标签: python map numpy scipy

我是python的新手,我的问题如下:

我定义了一个函数func(a,b),它返回一个给定两个输入值的值。

现在我将数据存储在列表或numpy数组A,B中,并希望对每个组合使用func。 (A和B有超过​​一百万条)

ATM我使用此代码段:

for p in A:
  for k in B:
    value = func(p,k)

这需要花费很多时间。

所以我想的可能是这样的:

C=(map(func,zip(A,B)))

但这种方法只能成对使用......有什么想法吗?

感谢您的帮助

4 个答案:

答案 0 :(得分:3)

第一期

您需要为多对值计算f的输出。加速这种循环(计算)的“标准”方法是使您的函数f接受(NumPy)数组作为输入,并立即对整个数组进行计算(即,没有看到循环来自Python)。查看任何NumPy教程以获得介绍。

第二期

如果AB各有超过一百万个条目,则有一万亿个组合。对于64位数字,这意味着您只需要7.3 TiB的空间来存储计算结果。你有足够的硬盘来存储结果吗?

第三个问题

如果AB小得多,在您的特定情况下,您可以执行此操作:

values = f(*meshgrid(A, B))

meshgrid返回AB的笛卡尔积,因此它只是一种生成必须评估的点的方法。

摘要

  • 您需要有效地使用NumPy来避免Python循环。 (或者,如果所有其他方法都失败或者无法轻易地进行矢量化,请使用编译语言编写这些循环,例如使用Cython

  • 使用太字节数据很难。你真的需要这么多数据吗?

  • 任何在循环中调用函数f 1e12次的解决方案都必然会很慢,特别是在CPython中(这是默认的Python实现。如果你不确定而且你是使用NumPy,你也在使用它。)

答案 1 :(得分:1)

百万分之一百万是1万亿。拨打f一万亿次将需要一段时间。

除非您有办法减少要计算的值的数量,否则您无法做到比以上更好。

答案 2 :(得分:1)

假设,itertools.product可以满足您的需求:

from itertools import product

pro = product(A,B)
C = map(lambda x: func(*x), pro)

只要它是生成器,它就不需要额外的内存

答案 3 :(得分:1)

如果你使用NumPy,你肯定应该看看为此类问题设计的np.vectorize函数......