【问题标题】:Python ValueError abs of an array数组的 Python ValueError abs
【发布时间】:2011-12-13 03:48:14
【问题描述】:

我是 python 新手,一直无法弄清楚如何解决这个问题。我正在尝试对数组中的每个值进行迭代,并返回最终值数组。 e 是用户输入的单个值,而 M 是可变长度的数组。我试图对 E 的每个值循环迭代,直到它接近解开普勒方程 M=E-e*sin(E),然后返回给定 M 的每个 E 的完成数组。

def eccano(e, M):
   E=M
   for i in range(0,len(M)):
       while abs(E-e*sin(E)-M[i]) > 10**(-4):
           E=E-((E-e*sin(E)-M[i])/(1-e*cos(E)))
   return E

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "ME.py", line 7, in eccano
    while abs(E-e*sin(E)-M[i]) > 10**(-4):
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

有什么建议吗?谢谢!

【问题讨论】:

  • 您要解决什么问题?你希望这段代码做什么? (考虑一下,问一个具体问题比仅仅征求建议要好得多。)
  • 自从E=M,你试过用E[i]吗? while abs(E[i]-e*sin(E[i])-M[i]) &gt; 10**(-4): ...
  • e和M有哪些种类和形状?
  • 虽然它与问题正交,但对于任何好奇的人,我都知道 OP 正在尝试做什么:求解偏心异常的开普勒方程。 (作为一个正在康复的天文学家最终必须派上用场..)
  • 正如回溯所说的“使用 a.any() 或 a.all()”,例如只要至少一个值高于 1e-4 就进行迭代:np.any(np.abs (E-e*sin(E)-M[i]) > 10**(-4)):... numpy 无法读懂你的想法,无论你想要任何或全部,所以它不会猜测。

标签: python numpy


【解决方案1】:

不确定您实际上要做什么,但问题是:

while abs(E-e*sin(E)-M[i]) > 10**(-4):

abs() 中的所有这些操作都在 numpy 数组中按元素工作,因此您正在做一些以数组结尾的事情,取该数组中每个元素的绝对值,然后与 10**(- 4) 并以布尔数组结束。它抱怨它无法将其评估为“True”或“False”,因为它是一个可能同时包含 True 和 False 值的数组。

【讨论】:

  • e 是用户输入的单个值,而 M 是可变长度的数组。我试图循环迭代 E 的每个值,直到它接近解开普勒方程 M=E-e*sin(E) (@DSM 指出我的意图是正确的),然后返回给定 M 的每个 E 的完成数组. 我希望这会有所帮助——请原谅任何错误的语言,我正在自学python!
  • 好的,现在决赛已经结束了,我更仔细地查看了 OP,我想我已经接近你想要做的事情了;这是用牛顿法求解E-e*sin(E) = M吧?是你有多个 M 并且你想返回一个数组 E 使得每个 E 对应一个 M,还是有其他事情我没有得到?
【解决方案2】:

Abs 返回给定的类型,因此您必须选择 E[i],使用 sum 之类的运算,或者只在 E 中使用 for i。
例如:

abs(np.array([-1, 2, -4])) = array([1, 2, 4])

假设您希望 abs(E-e*sin(E)-M[i]) 的 2 范数大于 10^-4,您可以这样写:

np.linalg.norm(abs(E-e*sin(E)-M[i]),2) > 10**(-4)

如果您正在循环条件中寻找其他内容,请添加更多信息。现在还不能推断出你想要什么。

【讨论】:

    【解决方案3】:

    这看起来像是Newton–Raphson method 的实现。我无法提供具体的帮助,因为我不知道函数是什么,但这是我在 Wikipedia 页面中对示例进行编码的方式:

    import numpy as np
    
    def newtons(start_value, threshold):
       x = start_value
    
       stop = False
       while stop == False:
          x_previous = x
          # x -= function / first derivative of function
          x -= (np.cos(x) - x**3 )/ (-np.sin(x) - 3 * x**2)
    
          if np.abs(x - x_previous) < threshold:
             stop = True
    
       return x
    
    
    print newtons(0.5, 0.0001)
    

    让我们知道这是否是您想要做的,e 和 M 是什么,以及具体的功能是什么。

    【讨论】:

      猜你喜欢
      • 2020-02-10
      • 2012-06-02
      • 2010-10-23
      • 2015-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      相关资源
      最近更新 更多