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

迭代两个或多个列表/numpy数组。。。并相互比较每个项目,避免python中的循环,python,map,numpy,scipy,Python,Map,Numpy,Scipy,我是python新手,我的问题如下: 我定义了一个函数func(a,b),在给定两个输入值的情况下返回一个值 现在,我将数据存储在列表或numpy数组A、B中,并希望对每个组合使用func。(A和B有100多万份参赛作品) 我用这个片段: for p in A: for k in B: value = func(p,k) 这真的需要很多时间 所以我想可能是这样的: C=(map(func,zip(A,B))) 但这种方法只能成对使用。。。有什么想法吗 谢谢你的帮助一百万乘以一百万

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

我定义了一个函数
func(a,b)
,在给定两个输入值的情况下返回一个值

现在,我将数据存储在列表或numpy数组
A、B
中,并希望对每个组合使用
func
。(A和B有100多万份参赛作品)

我用这个片段:

for p in A:
  for k in B:
    value = func(p,k)
这真的需要很多时间

所以我想可能是这样的:

C=(map(func,zip(A,B)))
但这种方法只能成对使用。。。有什么想法吗


谢谢你的帮助

一百万乘以一百万等于一万亿。调用
f
1万亿次需要一段时间


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

假设,itertools.product满足您的需要:

from itertools import product

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

就其生成器而言,它不需要额外的内存

如果您使用NumPy,您肯定应该查看针对此类问题设计的功能…

第一个问题 您需要计算多对值的
f
输出。加速此类循环(计算)的“标准”方法是使函数
f
接受(NumPy)数组作为输入,并立即对整个数组进行计算(即,从Python中看不存在循环)。查看任何NumPy教程以获得介绍

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

第三期 如果
A
B
小得多,在您的特定情况下,您可以这样做:

values = f(*meshgrid(A, B))
返回
A
B
的笛卡尔积,因此这只是生成必须计算的点的一种方法

总结
  • 您需要有效地使用NumPy来避免Python循环。(或者,如果所有其他方法都失败了,或者无法轻松地对它们进行矢量化,则使用编译语言编写这些循环,例如使用)

  • 处理TB级的数据非常困难。你真的需要那么多数据吗

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


您的
func()
是对称的,对吗
func(a,b)
==
func(b,a)
?@madzone:您正在对这些对进行什么样的比较?我们需要有关
func
以及您计划对结果做什么的更多信息。您是否试图将所有结果同时存储在万亿项矩阵中?(祝你好运!)或者你只需要在不存储任何结果的情况下对每个结果进行迭代吗?@PhilH,这只是对
a
B
这两个数字的数值积分,作为borders@senderle,我需要存储结果并将其可视化,例如使用pyplot@madzone:万亿美元?您不想存储或计算万亿个值,更不用说尝试可视化它们了。这将调用
f(a[0],B[0])
f(a[1],B[1])
,等等。可能不是OP想要的。@adray,我想你想要的是带有替换的组合,因为显然func(a,b)==func(b,a)。@在我细分数组后效果非常好。非常感谢。谢谢你的回答。不幸的是,CPython不是atm的选择。meshgrid到底做什么?你能再进一步解释一下吗?好的,你看起来有点困惑(我理解这一点,我很抱歉在我的回答中使用了这么多术语,但你现在有一些相互交织的问题)。我会尽量扩大我的答案。嗨,thx@jorgeca。正如您所建议的,我还尝试避免显式循环,并编写了所有函数,以便在整个numpy.array上运行它们。我可以制作数组的子样本,并将代码分块运行,这是一个很好的观点。不过,计算时间太长了。。thnxanyway@madzone我强烈怀疑你做的计算太多了。我在重复我自己,但是你希望如何存储结果?您将使用哪种机器使用matplotlib绘制超过7 TiB的数据?如果使用HiRes显示器的分辨率为200 ppi,每个计算值1个像素,您需要超过160平方米的显示器才能看到整个画面!!@jorgeca I存储结果并绘制直方图。我将尝试列表理解,让您知道结果。NumPy让您将循环(及其开销,包括函数调用)下推到C,因此速度要快得多。尽管如此,1万亿次浮点运算还是相当多……嗨@Pierre GM,据我所知,np.vectorize类似于python映射函数。如果我对一个函数进行矢量化并使用两个数组调用它,它的工作方式如下:
f(a[0],B[0]),f(a[1],B[1])
。但我需要把每一个组合都叫进去。谢谢