我试图在Python中绘制等高线图,使用比下面更复杂的代码。但是,同样的问题出现在下面的简单例子中:
import numpy as np
from scipy import integrate
import matplotlib.pyplot as plt
def A(x):
return integrate.quad(lambda i: x-i, 0, x)
n = 100
x = np.linspace(0, 10, n)
y = np.linspace(0, 10, n)
X, Y = np.meshgrid(x, y)
M = A(X) + Y # THE ERROR ARISES HERE
plt.contour(X, Y, M)
plt.show()
以下错误信息显示在上面指定的行中:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
我想使用integrate.quad()
。
任何人都可以帮助我吗? 提前谢谢。
答案 0 :(得分:2)
正如@WarrenWeckesser在评论中正确指出的那样,这两个问题是
quad
返回一个元组,您只需要第一个成员。解决方案:
quad
:quad( ..., )[0]
的回报编入索引,仅收取第一项vectorize
对A
的调用,以便逐个调用数组X
的所有标量。请注意,这不是很有效,但对于此处提供的100x100元素数组应该没问题。完整的解决方案看起来像
import numpy as np
from scipy import integrate
import matplotlib.pyplot as plt
def A(x):
return integrate.quad(lambda i: x-i, 0, x)[0]
n = 100
x = np.linspace(0, 10, n)
y = np.linspace(0, 10, n)
X, Y = np.meshgrid(x, y)
M = np.vectorize(A)(X) + Y
plt.contour(X, Y, M)
plt.show()