Python类型错误:“numpy.ndarray”对象不可调用

2024-04-26 11:54:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在定义一组函数,将地心参考系转换为经典轨道元素。这是我的密码:

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)是不可调用的。我不知道该怎么解决这个问题


Tags: 函数importnumpynormreturndefnparray
3条回答

你的问题是你被范围界定弄糊涂了

h(r, v)是函数的结果,因此是numpy数组,而h是函数本身。您正在将h(r, v)作为h传递给i,但仍希望作用域i中的h是一个函数

另外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范围内,以便更容易跟踪,但面向对象编程的前端工作可能超出了您的需要

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

虽然局部变量可以是简短、单一的名称,但函数的信息量应该更大。特别地,您已经定义了一个函数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)))

相关问题 更多 >