这是代码的简化版本。当没有标志运行时,我得到结果。 但是,当我使用标志时,它会抛出错误。我需要通过fsolve运行此代码。代码已经简化。
错误:具有多个元素的数组的真值是不明确的。使用a.any()或a.all()
import numpy as np
from scipy.optimize import fsolve
price = np.array([39, 34, 29, 25, 21])
S = np.repeat(300, len(price))
flag = np.array([1, 1, 0, 1, 1])
def Val(S, flag = 0):
p = 4
if flag == 0: p = S * flag
elif flag == 1: p = S * flag
return p
val = lambda x: Val(S, flag) - price
print fsolve(val, np.repeat(35, len(S)))
答案 0 :(得分:1)
flag
中Val
的默认值是标量,但您在上面声明的flag
变量是一个数组。当flag
是标量时,flag == 0
也会是标量(True
或False
),您的if
和elif
语句将会有道理。
但是,如果flag
是一个数组,flag == 0
的输出将是一个布尔数组,其形状与flag
相同。在您的情况下,它将是np.array([False, False, True, False, False])
。在数组的情况下,if flag == 0
是不明确的,因为数组中可能有多个元素可以是true或false。如果(如您的示例中)数组中的某些元素为真且有些元素为假,那么我们应该执行if
分支还是elif
分支?
在你的情况下,它甚至不重要,因为你在两种情况下都执行完全相同的计算。
答案 1 :(得分:0)
这解决了这个问题:
import numpy as np
from scipy.optimize import fsolve
price = np.array([39, 34, 29, 25, 21])
S = np.repeat(300, len(price))
flag = np.array([1, 1, 0, 1, 1])
def Val(S, flag = 0):
return np.where(flag, S + price, S - price )
val = lambda x: Val(S, flag) - price
print fsolve(val, np.repeat(35, len(S)))