Не понимаю, почему я получаю сообщение об ошибке «объект numpy.ndarray не вызывается»? - PullRequest
0 голосов
/ 16 мая 2018

У меня есть код, который использует numpy и hermval вместе с несколькими функциями для вычисления 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

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Основываясь на предложении @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]
0 голосов
/ 16 мая 2018

lowest_eigenvectors имя параметра в функции psi конфликтует с функцией lowest_eigenvectors.

РЕДАКТИРОВАТЬ: похоже, вам не нужно передавать psi функциюlowest_eigenvectors, поскольку функция psi находится в той же лексической области действия , что и lowest_eigenvectors.

...