【问题标题】:3D graph error: "The truth value of an array with more than one element is ambiguous"3D 图形错误:“具有多个元素的数组的真值不明确”
【发布时间】:2021-04-21 22:22:39
【问题描述】:

我正在尝试绘制 3D 图形,使用重新存在的函数来生成 Z 值。但是,这会产生错误“具有多个元素的数组的真值不明确”。这看起来很奇怪,因为我能够使用相同的函数和 y、x 值生成 Z 值列表,但是一旦包含 3D 图形代码,就会发生错误。

我的绘图代码是:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.axes3d import Axes3D
from matplotlib import cm
 
def f(tau,tau_b):                             #re-use society welfare function of tau & tau_b, using corr=0.6
    Z = society_welfare2 (0.6, tau, tau_b)
    return Z

xgrid=np.linspace(1e-5, 1-1e-5,100)   #tau grid
ygrid=np.linspace(1e-5, 1-1e-5,100)   #tau_b grid
tau,tau_b=np.meshgrid(xgrid,ygrid)

fig=plt.figure(figsize=(8,6))
ax=fig.add_subplot(111,projection='3d')
ax.plot_surface(tau,
                tau_b,
                f(tau,tau_b),
                rstride=2,cstride=2,
                cmap=cm.jet,
                alpha=0.7,
                linewidth=0.25)
ax.set_zlim(-0.5,1.0)
plt.show()

我的social_welfare2功能码:

def society_welfare2 (corr, tau, tau_b):
    
    cov   = [[1,corr], [corr,1]]   #covariance
    epsilon_start,b_start = np.random.multivariate_normal(mean, cov, sample_N).T 

    epsilon     = np.exp(epsilon_start)  #to ensure epsilon positive
    b     = np.exp(b_start)              #to ensure b positive

    indv_welfares = []
    
    def GBC (t_o):
        taxes_paid = []

        for i in range(sample_N):                     #loop over all agents to find their C1,C2,L

            def consumption_functions(Lguess,epsilon=epsilon,b=b):
                C2 = (((1-tau)*epsilon[i]*w*Lguess) +(1-tau_b)*b[i] + ((t_o)/(1+r)))/((1/((beta**(1/gamma))*((1+r)**(1/gamma)))) + (1/(1+r)))
                C1 = C2 /((beta**(1/gamma))*(1+r)**(1/gamma))
                return -Utility(C1,C2,Lguess)

            result = minimize_scalar(consumption_functions,bounds=(0,1),method='bounded', args=(epsilon, b))

            opt_L = result.x
        
            opt_C1=(((1-tau)*(epsilon[i])*w)/(opt_L**sigma))**(1/gamma)
        
            opt_C2=(opt_C1)*((beta**(1/gamma))*(1+r)**(1/gamma))
        
            income_tax = tau*(epsilon[i])*w*opt_L         
            bequest_tax = tau_b*(b[i])                 
            taxes_paid.append(income_tax)        
            taxes_paid.append(bequest_tax)   
            
            welfare_func = opt_C1**(1-gamma)/(1-gamma)-opt_L**(1+sigma)/(1+sigma) + beta*(opt_C2**(1-gamma)/(1-gamma))
            indv_welfares.append(welfare_func)
    
        total_tax_revenue = sum(taxes_paid)  
    
        return total_tax_revenue - (10000*t_o)

    result1 = minimize_scalar(GBC,bounds=(1e-5, 100000),method='bounded')
    
    opt_t_o = result1.x
    
    total_welfare = sum(indv_welfares)
    return total_welfare   

完整的回溯错误代码:

ValueError                                Traceback (most recent call last)
<ipython-input-19-3633f4a9db76> in <module>
     18 ax.plot_surface(tau,
     19                 tau_b,
---> 20                 f(tau,tau_b),
     21                 rstride=2,cstride=2,
     22                 cmap=cm.jet,

<ipython-input-19-3633f4a9db76> in f(tau, tau_b)
      7 
      8 def f(tau,tau_b):                             #re-use society welfare function of tau & tau_b, using corr=0.6
----> 9     Z = society_welfare2 (0.6, tau, tau_b)
     10     return Z
     11 

<ipython-input-17-321a709b9684> in society_welfare2(corr, tau, tau_b)
     61         return total_tax_revenue - (10000*t_o)
     62 
---> 63     result1 = minimize_scalar(GBC,bounds=(1e-5, 100000),method='bounded')
     64 
     65     opt_t_o = result1.x

/opt/anaconda3/lib/python3.8/site-packages/scipy/optimize/_minimize.py in minimize_scalar(fun, bracket, bounds, args, method, tol, options)
    798         if isinstance(disp, bool):
    799             options['disp'] = 2 * int(disp)
--> 800         return _minimize_scalar_bounded(fun, bounds, args, **options)
    801     elif meth == 'golden':
    802         return _minimize_scalar_golden(fun, bracket, args, **options)

/opt/anaconda3/lib/python3.8/site-packages/scipy/optimize/optimize.py in _minimize_scalar_bounded(func, bounds, args, xatol, maxiter, disp, **unknown_options)
   1956     rat = e = 0.0
   1957     x = xf
-> 1958     fx = func(x, *args)
   1959     num = 1
   1960     fmin_data = (1, xf, fx)

<ipython-input-17-321a709b9684> in GBC(t_o)
     41                 return -Utility(C1,C2,Lguess)
     42 
---> 43             result = minimize_scalar(consumption_functions,bounds=(0,1),method='bounded', args=(epsilon, b))
     44 
     45             opt_L = result.x

/opt/anaconda3/lib/python3.8/site-packages/scipy/optimize/_minimize.py in minimize_scalar(fun, bracket, bounds, args, method, tol, options)
    798         if isinstance(disp, bool):
    799             options['disp'] = 2 * int(disp)
--> 800         return _minimize_scalar_bounded(fun, bounds, args, **options)
    801     elif meth == 'golden':
    802         return _minimize_scalar_golden(fun, bracket, args, **options)

/opt/anaconda3/lib/python3.8/site-packages/scipy/optimize/optimize.py in _minimize_scalar_bounded(func, bounds, args, xatol, maxiter, disp, **unknown_options)
   2015             print("%5.0f   %12.6g %12.6g %s" % (fmin_data + (step,)))
   2016 
-> 2017         if fu <= fx:
   2018             if x >= xf:
   2019                 a = xf

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

【问题讨论】:

  • 请提供完整的详细信息 -- 错误发生在哪里?
  • 您尝试在需要简单 True/False 的上下文中使用布尔数组的地方。在哪里?那是你告诉我们的!我们不喜欢猜测!
  • 您必须决定是要all True 沿轴还是any True 沿轴。我们不知道您想要或需要什么。如果您使用错误消息搜索 SO 并阅读结果中的所有问答,您将了解问题所在。
  • 错误消息中是否有任何标记为“回溯”的内容?我们希望看到这一点。
  • @hpaulj 当然,我会编辑帖子以包含完整的错误代码

标签: python numpy minimize


【解决方案1】:

回溯的最低点是

if fu <= fx:

这是比较if 中的两个变量。如果fufx 是标量或单值数组,这将起作用。但是如果其中任何一个是多值数组 if 就会引发这个错误。

此时我们的任务是将这些变量追溯到您的代码。我怀疑您正在为某些参数提供数组,它们/应该是标量。

看顶部。当您要求绘图时会发生这种情况,但参数是函数调用:

f(tau,tau_b)

然后通过函数调用minimize 上的GBC 函数。我认为GBCfunc 在:

fx = func(x, *args)

这引发了一个问题,GBC 究竟返回了什么?它在_minimize_scalar 中使用,因此它应该只返回一个值。

它的返回表达式是什么?

return total_tax_revenue - (10000*t_o)

你认为你可以从那里进行分析吗?

现在您明白我们为什么坚持要查看traceback。错误在您的代码中,但是到达那里的顺序很长,并且仅通过阅读代码并不明显。

编辑

糟糕,我看到另一个级别的minimize,它使用了

consumption_functions

它有几个参数,epsilonb。我想我们可以推断出这些是什么。但是什么是

Utility

fu &lt;= fx 似乎正在针对绑定的fu 测试fx 返回值。假设边界是标量,那么值fx 必须是一个数组。是吗???

【讨论】:

  • GBC的重点只是为了求根建立一个函数(即使用minimize scalar求一个#使得0 = total_tax_revenue - (10000*t_o))。
  • 我不在乎目的。 我想知道它产生了什么。 它是按照最小化代码的要求产生一个数字,还是按照错误提示产生一个数组,多个值。
  • 在进一步阅读回溯时,我遇到了一个很大的未知数Utility。查看我的编辑。
  • 我认为 GBC 的最小化标量只会产生 1 个根(所以是的,一个值不是数组)。每当我运行该代码时,它只会产生 1 个值。实用程序也是一个返回 1 个值的函数。
猜你喜欢
  • 2015-01-06
  • 2019-08-21
  • 1970-01-01
  • 2019-03-19
  • 2020-03-15
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
  • 1970-01-01
相关资源
最近更新 更多