Python:具有多个元素的数组的真值不明确。使用a.any()或a.all()

时间:2018-12-04 06:44:58

标签: python numpy matplotlib

我有一个函数需要针对一系列参数进行计算和可视化。

以下是Jupyter代码的示例:

%pylab
%matplotlib inline  
%matplotlib notebook
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter

def testFunc(x):
    a = x[0] - x[1]

    #if a < 0:
    #    a = 0

    b = 2*(a**3)
    return b

X = np.arange(100, 10000, 10)
Y = np.arange(3600, 3900, 10)
X, Y = np.meshgrid(X, Y)
Z = testFunc([X, Y])

fig = plt.figure(figsize=(12,8))
ax = fig.gca(projection='3d')
surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm)
fig.colorbar(surf, shrink=0.5, aspect=5)
plt.show()

工作正常: enter image description here

但是,我需要向该功能添加其他逻辑:

if a < 0:
    a = 0

当我取消注释这些行时,我得到了错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-15-273b40ed507a> in <module>()
     20 Y = np.arange(3600, 3900, 10)
     21 X, Y = np.meshgrid(X, Y)
---> 22 Z = testFunc([X, Y])
     23 
     24 fig = plt.figure(figsize=(12,8))

<ipython-input-15-273b40ed507a> in testFunc(x)
     11     a = x[0] - x[1]
     12 
---> 13     if a < 0:
     14         a = 0
     15 

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

该函数是否在“ a”中应用值数组?因此,它不知道将哪个项目与“ 0”进行比较。

     

您能推荐一种很好的方法来计算带有条件的函数吗   属性的范围(可能将其可视化)?

2 个答案:

答案 0 :(得分:1)

有几个选项:这里有2个(注释您不想使用的一个):

def testFunc(x):
    a = x[0] - x[1]

    # option 1:
    a[a<0] = 0
    # option 2
    a = np.clip(a,0,np.inf)

    b = 2*(a**3)
    return b

用您的代码绘图后的结果:

enter image description here

答案 1 :(得分:1)

好吧,XY是数组。当您将数组的数组传递给testFunc时,a也是一个数组。您需要比较a的元素以检查它们是否小于0,然后将它们设置为0(例如,以for循环为例)