【问题标题】:Python: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()Python:具有多个元素的数组的真值是模棱两可的。使用 a.any() 或 a.all()
【发布时间】:2019-05-05 12:50:33
【问题描述】:

我有一个函数,我需要计算和可视化一系列参数。

这里是一个 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()

它工作正常:

但是我需要在函数中添加一个额外的逻辑:

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”比较哪个项目。

您能否推荐一种计算具有条件的函数的好方法 属性范围(可以可视化)?

【问题讨论】:

  • 您的另一个隐藏且几乎不引人注意的问题也是重复的 - 使用a[a&lt;0] = 0
  • 哦,你在 17 小时前回复了那个帖子!今天是你的一天 :) 谢谢,要在那里阅读你的答案......
  • 是的,真的很幸运,否则我永远不会找到重复的 - 那里的标题具有误导性,所以你的帖子是一个很好的路标。

标签: python numpy matplotlib


【解决方案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

使用您的代码绘制后的结果:

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 谢谢!我对此产生了怀疑。但我认为“Z = testFunc([X, Y])” 为每对值而不是整个数组调用 testFunc()。
    • 没问题,祝你有美好的一天
    猜你喜欢
    • 2017-01-23
    • 2019-10-08
    • 1970-01-01
    • 2021-01-20
    • 2018-03-28
    • 1970-01-01
    • 2021-08-12
    • 2015-09-16
    • 1970-01-01
    相关资源
    最近更新 更多