【问题标题】:Python type error: 'numpy.ndarray' object is not callablePython 类型错误:“numpy.ndarray”对象不可调用
【发布时间】:2021-02-23 01:23:12
【问题描述】:

我正在定义一组函数,用于从以地球为中心的参考系转换为经典轨道元素。这是我的代码:

import numpy as np
import matplotlib.pyplot as plt

#converting r,v to orbital elements
u = 3.986*10e14 #gravitational parameter for Earth
list_r = [-2413.9, 6083.8, -1136.0]
r = np.array(list_r)
list_v= [-6.5461, -3.1365, -3.6385] 
v = np.array(list_v)

def h(r,v):
    return np.cross(r,v)


list_k = [0,0,1]
k = np.array(list)

def n(k,h):
    return np.cross(k,h)
def e_vec(v,r):
    vector = 1/u * (np.dot((np.linalg.norm(v))**2-u/np.linalg.norm(r),r)-np.dot(np.dot(r,v),v))
    return vector

def p(h,u):
    return (np.linalg.norm(h))**2/u
        

def a(p,e):
    return p/(1-np.linalg.norm(e_vec)**2)



def i(h):
    
    return np.arccos(np.dot(k,h(r,v))/np.linalg.norm(h(r,v)))
   

list_I = [1,0,0]
I = np.array(list_I)

def ohm(I,n):

    nI = np.dot(n(h),I)
    ohm = np.acos(nI/n)
    return ohm
    
def w(n,e):
    w = np.arccos(np.dot(n,e)/(np.linalg.norm(n)*np.linalg.norm(e)))
    return w

def f(e,r):
    f = np.arccos(np.dot(e_vec(v,r),r)/(np.linalg.norm(e_vec(v,r))*np.linalg.norm(r)))
    return f
print(h(r,v))
print(e_vec(v,r))
print(p(h(r,v),u))
print(i(h(r,v)))
print(ohm(I,n))
print(w)
print(f)

我收到此错误:TypeError: 'numpy.ndarray' 对象不可调用,对于函数 i(h)。我不知道我应该如何解决这个问题。

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    您有一个名为def h(r,v) 的函数,并且您还将参数命名为h。这是一个冲突。在函数i 的作用域中,名称h 指的是参数,即一个numpy.ndarray,而不是函数。您应该避免使用相同的名称。

    【讨论】:

    • 我打算使用函数 h 作为函数 i 的输入。我应该如何更改变量名?
    • @ArnoldSchwarzenegger 我认为你应该更恰当地命名你的变量。当我阅读您的代码时,我不知道发生了什么,因为我无法理解每个变量和每个函数的含义。例如hin,它们不适合函数名。我建议您使代码更清晰,然后我可以帮助您调试代码。我建议你先学习命名约定。问候。
    • 不是函数名的问题,是作用域的问题。
    【解决方案2】:

    虽然局部变量可以是简短的单一名称,但函数应该提供更多信息。特别是您定义了一个函数h,但您也使用h 作为局部变量。这让您(和我们)感到困惑。

    在几个函数中h 是一个局部变量和一个数组(至少这是np.cross 所期望的):

    def n(k,h):
        return np.cross(k,h)
    

    类似

    def p(h,u):
        return (np.linalg.norm(h))**2/u
    

    但是i 打破了这种模式:

    def i(h):
        return np.arccos(np.dot(k,h(r,v))/np.linalg.norm(h(r,v)))
    

    这里的h 仅在它是一个函数时才有效。但是rvk你还没有传入。

    def i(k,h):
        return np.arccos(np.dot(k,h)/np.linalg.norm(h)
    

    与您的其他功能更加一致。也更符合

    print(i(h(r,v)))
    

    【讨论】:

      【解决方案3】:

      您的问题是您对范围界定感到困惑。

      h(r, v) 是函数的 result,因此是 numpy 数组 - 而 h 是函数本身。您将h(r, v) 传递给i 作为h,但仍期望hi 范围内成为一个函数。

      另外k 不在i 的范围内,所以这也会导致错误。你可能应该定义

      def i(k, r, v): 
          return np.arccos(np.dot(k, h(r, v)) / np.linalg.norm(h(r, v)))
      

      并传递i(k, r, v),或定义:

      def i(k, h): 
          return np.arccos(np.dot(k, h) / np.linalg.norm(h))
      

      并通过i(k, h(r, v))

      更好的方法是将它全部包装在 class 中,并将所有变量保存在 self 范围内,以便更容易跟踪,但面向对象编程的前端工作可能是一个步骤超出你想要的。

      【讨论】:

        猜你喜欢
        • 2019-05-27
        • 2021-12-23
        • 2019-09-04
        • 2021-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多