不明白为啥我会收到“numpy.ndarray object not callable”错误?

Posted

技术标签:

【中文标题】不明白为啥我会收到“numpy.ndarray object not callable”错误?【英文标题】:Don't see why I'm getting 'numpy.ndarray object not callable' error?不明白为什么我会收到“numpy.ndarray object not callable”错误? 【发布时间】:2018-10-25 22:03:18 【问题描述】:

我有一个代码,它使用numpyhermval 以及多个函数在最后为给定参数计算psi。但我不断收到错误numpy.ndarray object not callable,我真的不明白为什么会这样。以下是我的代码的相关部分:

import numpy as np
import math
from numpy.linalg import eigh
from numpy.polynomial.hermite import hermval

def matrices(N, lam):
    H_0 = np.zeros([N+1, N+1])
    x_four_matrix = np.zeros([N+1, N+1])
    for n in range(N+1):
        for m in range(N+1):
            if n == m:
                H_0[n][m] = n + 0.5
                x_four_matrix[n][m] = (6.0*n**2 + 6.0*n + 3.0)/4.0
            elif n == m-2:
                x_four_matrix[n][m] = np.sqrt((n+1)*(n+2))*(n+1.5)
            elif n == m+2:
                x_four_matrix[n][m] = (n-0.5)*np.sqrt(n*(n-1))
            elif n == m-4:
                x_four_matrix[n][m] = np.sqrt((n+1)*(n+2)*(n+3)*(n+4))/4.0
            elif n == m+4:
                x_four_matrix[n][m] = np.sqrt((n-3)*(n-2)*(n-1)*n)/4.0
    return H_0, x_four_matrix

def H_lam(N, lam):
    return matrices(N, lam)[0] + lam*matrices(N, lam)[1]

# Solve for eigenvalues (energies)
def lowest_eigenvals(N, n, lam):
    lowest_eigs = []
    eigenvals = eigh(H_lam(N, lam))[0]
    eigenvals.sort()
    for i in range(n):
        lowest_eigs.append(eigenvals[i])
    return lowest_eigs

# Solve for eigenvectors
def lowest_eigenvectors(N, n, lam):
    lowest_vecs = []
    for i in range(len(lowest_eigenvals(N, n, lam))):
        for j in range(len(eig(H_lam(N, lam))[0])):
            if lowest_eigenvals(N, n, lam)[i] == eigh(H_lam(N, lam))[0][j]:
                lowest_vecs.append(eigh(H_lam(N, lam))[1][j])
    return np.array(lowest_vecs)

def N_coeff(i):
    return 1.0/np.sqrt(2**i*math.factorial(i)*np.sqrt(np.pi))

# for E_0 (first eigenfunction):
def psi(x, lowest_eigenvectors, i):
    herm_coeffs = [element*N_coeff(i) for element in lowest_eigenvectors(N, n, lam)[i]]
    return np.exp((x**2)/2.0)*hermval(x, herm_coeffs)

print [element*N_coeff(0) for element in lowest_eigenvectors(100, 4, 0.1)[0]]
print psi(1.0, lowest_eigenvectors(100, 4, 1.0), 0) # for lambda = 1

然后在这里我的最后一个print 语句,我得到TypeError: 'numpy.ndarray' object is not callable 来自我最后一个函数中的herm_coeffs 行。但我不确定为什么会这样,因为倒数第二个 print 语句打印正确!这是怎么回事?

这是回溯:

TypeError                                 Traceback (most recent call last)
<ipython-input-350-04692f269a26> in <module>()
     13 # print [element*N_coeff(0) for element in lowest_eigenvectors(100, 4, 0.1)[0]]
     14 
---> 15 print psi(1.0, lowest_eigenvectors(100, 4, 0.1), 0)

<ipython-input-350-04692f269a26> in psi(x, lowest_eigenvectors, i)
      7 # for E_0 (first eigenfunction):
      8 def psi(x, lowest_eigenvectors, i):
----> 9     herm_coeffs = [element*N_coeff(i) for element in lowest_eigenvectors(N, n, lam)[i]]
     10     return np.exp((x**2)/2.0)*hermval(x, herm_coeffs)
     11 

TypeError: 'numpy.ndarray' object is not callable

【问题讨论】:

该错误意味着您正在尝试使用 numpy 数组,就好像它是一个函数(可调用)一样。这可能是因为您错误地使用了() 来索引数组。或者你认为是一个函数,实际上是一个数组,由于代码前面的一些变量名称混淆。 能否提供回溯? @Scott 查看新编辑 你的参数名和你的函数名冲突 【参考方案1】:

函数psi中的lowest_eigenvectors参数名称与函数lowest_eigenvectors冲突。

编辑:看起来您不需要传递 psi 函数 lowest_eigenvectors,因为 psi 函数与 lowest_eigenvectors 在同一个 lexical scope 内。

【讨论】:

我明白了。那我需要去掉psi函数里面lowest_eigenvectors的参数吗?我知道可以在其他函数中调用函数,这就是这里的问题吗? 您可以将参数重命名为 lowest_eigenvectors 以外的其他名称。 但我确实需要将该参数作为lowest_eigenvectors 函数的输出。【参考方案2】:

根据@Scott 的建议,我认为psi 应该改为:

def psi(x, vectors, i):
    herm_coeffs = [element*N_coeff(i) for element in vectors[i]]
    return np.exp((x**2)/2.0)*hermval(x, herm_coeffs)

print psi(1.0, lowest_eigenvectors(100, 4, 1.0), 0)

换句话说,您计算vectors = lowest_eigenvectors(100, 4, 1.0),并将其传递给psi。即使你得到了这个数组与函数的正确命名,使用:

lowest_eigenvectors(N, n, lam)

psi 中会出现问题,因为N, n, lam 既没有在函数中也没有在全局范围内定义。

我想知道该功能是否可以进一步简化:

herm_coeffs = N_coeff(i)*vectors[i]

【讨论】:

以上是关于不明白为啥我会收到“numpy.ndarray object not callable”错误?的主要内容,如果未能解决你的问题,请参考以下文章

我不明白为啥会抛出“调用未定义的方法 CI_Input()::event()”

为啥我会收到 IllegalArgumentException:不支持的频道配置?

不知道为啥我会收到 NullPointerException [重复]

我不知道为啥我会收到分段错误错误

不支持请求方法“GET”。为啥我会收到此错误?

为啥我会收到此错误:“不支持此功能(数字商品)。”?