You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python报错:'numpy.ndarray'对象不可调用的解决方法咨询

解决TypeError: 'numpy.ndarray' object is not callable错误

错误根源

问题出在find_k函数的一阶条件(FOC)计算中。调用V_function_prime(production(k) - R*phi*k)后得到的是numpy标量或数组,后续直接用括号(production_prime(k)-R*phi)会被Python解析为“调用这个数组对象”,而numpy数组本身不支持函数调用,因此触发TypeError。

修正方案

将find_k函数中FOC的乘法部分从括号改为*运算符,其他函数的V_function_prime调用逻辑无需修改:

修正后的find_k函数

def find_k(k, w, v_function_prime):
    # 把原代码中的括号改为*,表示乘法运算
    foc = (1-phi)*u_prime(w - (1-phi)*k) - beta*v_function_prime(production(k) - R*phi*k) * (production_prime(k)-R*phi)
    return foc

完整修正代码

import numpy as np
import copy as cp 
import scipy as sp
from scipy import optimize as optimize
from scipy.interpolate import PchipInterpolator as pchip

# primatives
beta = .8
R = 1.02
phi = .8

# define a grid
size = 100
w_grid = np.linspace(0.001,5,num = size)

# set up functions
def utility(c):
    return np.log(c)

def u_prime(c):
    return 1/c

def production(k):
    return k**(1/3)

def production_prime(k):
    return 1/3*k**(-2/3)

def production_2prime(k):
    return (-2/9)*k**(-5/3)

def inv_prod_prime(x):
    return (3*x)**(-2/3)

# define functions to get threshold value wbar and optimal policy b, k
def find_w(V_function_prime, k_star, capital_evolution):
    w_bar = (1-phi)*k_star + 1/(beta*R*V_function_prime(capital_evolution))
    return w_bar

# takes in value w and current guess of v_prime and returns optimal bond choice (b)
def find_b(b, w, v_function_prime, k_star):
    foc = u_prime(w - b - k_star) - beta*R*v_function_prime(production(k_star) + R*b)
    return foc

# takes in value w and current guess of v_prime and returns optimal capital choice (k)
def find_k(k, w, v_function_prime):
    # 修正:将括号改为乘法运算符*
    foc = (1-phi)*u_prime(w - (1-phi)*k) - beta*v_function_prime(production(k) - R*phi*k) * (production_prime(k)-R*phi)
    return foc

# value function iteration function
def vfi(R, phi, beta, size, tol):
    k_star = inv_prod_prime(R)
    capital_evolution = production(k_star)-R*phi*k_star
    
    # inital guess of value function is utility
    VV = utility(w_grid)
    
    # params of loop
    err = tol + 1
    epsilon = 1e-5
    
    while err > tol:
        V_previous = cp.copy(VV) 
        V_function = pchip(w_grid, VV)
        V_w = V_function(w_grid)
        V_function_prime = V_function.derivative(1)
        V_prime_w = V_function_prime(w_grid)
        
        w_bar = find_w(V_function_prime, k_star, capital_evolution)
        
        k_prime = np.zeros(size)
        b_prime = np.zeros(size)
        
        for i in range(size):
            # solve unconstrained region of state-space
            if w_grid[i] >= w_bar: 
                k_choice = k_star
                # limits set based on natural bounds for borrowing given in the SP
                b_choice = optimize.brentq(find_b, (-phi*k_star), (w_grid[i] - k_star - epsilon), args = (w_grid[i], V_function_prime, k_star))
            # solve constrained region of state-space
            else:
                bound = w_grid[i]/(1-phi) - epsilon
                k_choice = optimize.brentq(find_k, (epsilon), (bound), args = (w_grid[i], V_function_prime))
                b_choice = -phi*k_choice
            # add in new guesses for optimal b, k, and update value function vector
            k_prime[i] = k_choice
            b_prime[i] = b_choice
            VV[i] = utility(w_grid[i] - b_prime[i] - k_prime[i]) + beta*V_function(production(k_prime[i]) + R*b_prime[i])
        V_function_update = pchip(w_grid, VV)
        err = np.max(np.abs(V_function_update(w_grid) - V_w))
        print(err)
        V_function = V_function_update
    return V_function, b_prime, k_prime     
                     
vfi(R, phi, beta, size = 100, tol = 1e-3)  

补充说明

V_function.derivative(1)返回的是PCHIP插值函数,调用该函数会得到输入点对应的导数值(标量或numpy数组)。在Python中不能像数学公式那样用括号省略乘号,必须显式使用*运算符表示乘法,否则会被误判为函数调用。

内容的提问来源于stack exchange,提问作者user12459040

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 01:20:38