如何在Scipy中集成NumPy数组?

3

我有一个计算成本相对较高的函数,给定单个标量后返回一个numpy.array()对象。当我尝试使用scipy.integrate.romberg积分此函数时,针对标量参数进行积分,我会收到来自scipy内部的错误,这是由于它用于确定收敛的条件造成的:

Traceback (most recent call last):
  File "wqc.py", line 148, in <module>
    H_cycle = (m.pi / wt) * scipy.integrate.romberg(H_if, 0, m.pi / wt)
  File "/usr/lib/python2.6/site-packages/scipy/integrate/quadrature.py", line 471, in romberg
    while (abs(result - lastresult) > tol) and (i <= divmax):
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

有没有一种方法可以一次性集成整个数组,或者我需要逐个元素进行集成?我想避免第二种解决方案,因为没有简单的方法来计算数组中的一个元素。

3个回答

2
问题似乎出现在这里:
abs(result - lastresult) > tol
resultlastresult很可能是numpy数组(而不是单个值)。因此,上述整个表达式计算的是一个真值数组,而不是单个的True/False。因此,当您将上述表达式的结果与(i <= divmax)进行and运算时,会出现错误The truth value of an array with more than one element is ambiguous.。ValueError的建议是恰当的。您应该将真值数组转换为单个真值。
example = numpy.array([True, True, True, False])
example.any()
>>> True
example.all()
>>> False

这将解决该问题。


没错,但这是在 scipy.integrate.romberg 内部发生的,而不是我的代码。我可以将其作为补丁贡献,但如果有更正式的集成数组的方法,我想这样做。 - Chris Granade
还没有,但我可以制作一个玩具程序来模拟相同的错误。很快就会做到。 - Chris Granade

0

从纯数学意义上讲,你正在尝试做的事情是具有歧义的。积分例程无法知道您是否想要同时积分多个标量函数(就我所理解的而言),还是像这些怪兽之一:http://en.wikipedia.org/wiki/Vector_calculus#Theorems

我会在此处执行的操作是对昂贵函数进行制表、插值(使用scipy.interpld或UnivariateSpline),并积分它们。


你提供的所有定理都涉及到多变量函数(或向量变量),这就是为什么我强调所讨论的函数只接受单个标量的原因。话虽如此,插值的想法确实很有道理。你认为将昂贵的函数进行记忆化处理也可能有帮助吗? - Chris Granade
关于积分:比如说,进行线积分涉及到参数化一条线 - 剩下的就是对一个标量变量的积分。 - ev-br
关于记忆化:我不确定你具体指的是什么。当然,处理昂贵函数的确切技术取决于您的需求。最简单的方法,特别是如果内存不是太大的问题,就是在某个网格上制表,然后只从那一点开始处理插值。 - ev-br

-2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接