【问题标题】:How to integrate a numpy array in scipy?如何在 scipy 中集成一个 numpy 数组?
【发布时间】:2010-11-05 20:58:21
【问题描述】:

我有一个相对昂贵的计算函数,给定一个标量,它返回一个 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()

有没有办法一次整合整个数组,还是需要逐个元素整合?我想避免第二种解决方案,因为没有简单的方法可以计算 数组的一个元素。

【问题讨论】:

    标签: python arrays numpy scipy


    【解决方案1】:

    问题似乎在这里:

    abs(result - lastresult) > tol
    

    resultlastresult 可能是 numpy.arrays(而不是单个值)。因此,上面的整个表达式计算为一个真值array,而不是单个True/False。因此,当您使用(i &lt;= 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 内部,而不是我的代码。我可以将其作为补丁提供,但如果有更受认可的集成数组的方式,我愿意这样做。
    • 还没有,但我可以制作一个遇到同样错误的玩具程序。很快就会实现。
    【解决方案2】:

    您尝试做的事情在纯数学意义上是模棱两可的。集成例程无法知道您是否要同时集成多个标量函数(据我所知,您正在追求),或者您是否正在做类似这些野兽之一的事情:http://en.wikipedia.org/wiki/Vector_calculus#Theorems

    我会在这里做什么,我会将昂贵的函数制成表格,对其进行插值(使用 scipy.interp1d 或 UnivariateSpline),然后整合它们。

    【讨论】:

    • 您链接到的所有定理都涉及多个变量(或替代地,或向量变量)的函数,这就是为什么我强调所讨论的函数采用单个标量。也就是说,插值的想法很有意义。你认为记忆昂贵的功能是否也有帮助?
    • 关于积分:比方说,线积分涉及对线进行参数化——剩下的是对标量变量的积分。
    • 关于记忆:我不确定你的意思。处理昂贵功能的确切技术当然取决于您的需求。最简单的方法,特别是如果内存不是太大的问题,就是将它列在某个网格上,然后仅从该点开始处理插值。
    【解决方案3】:

    http://www.sagemath.org 可以提供数值积分的替代方法。

    【讨论】:

      猜你喜欢
      • 2016-12-28
      • 1970-01-01
      • 2012-08-11
      • 2018-10-10
      • 1970-01-01
      • 2016-11-24
      • 2011-02-13
      • 1970-01-01
      • 2020-05-18
      相关资源
      最近更新 更多