有谁可以请看一下Python中的以下功能代码?
import numpy as np
import scipy.stats as stats
from scipy.stats import poisson, norm
cs = 100
co = 300
mu = 4.7
G = poisson(mu)
p = G.pmf(np.arange(3*mu))
# Define Z(Q) function
def Z(Q):
for i in range(len(p)):
return sum(p[i]*cs*max((Q-i), 0) + p[i]*co*max((i-Q), 0))
# Plot Q and (Q)
import pylab as pl
x = []
y = []
for Q in range(0, 12):
x.append(Q)
y.append(Z(Q))
pl.plot(x, y, '-o')
pl.show()
错误消息显示在上一个“Plot”过程中: 在Z(Q)中,'numpy.float64'对象不可迭代。
我希望Z(Q)返回在范围(0,len(p))中对每个i求和的值,这是一个具有变量Q的函数。最后,绘图是Q(X轴)和Z(Q )(Y轴)每个Q可以绘制。
如何修改Z(Q)?谢谢!
如果我想输出[Q,Z(Q)]我怎么能做到?我的代码:
with open('opt.csv', 'wb') as fd:
a = csv.writer(fd, delimiter=',')
data1 = [['Order_Number', 'Cost'],
[Q, Z(Q)]]
a.writerows(data1)
答案 0 :(得分:0)
如果您期望Z(Q)返回多个值,您可能需要使用“yield”语句:
def Z(Q):
for i in range(len(p)):
yield sum(p[i]*cs*max((Q-i), 0) + p[i]*co*max((i-Q), 0))
这将允许它被迭代并将返回for循环的每次运行的总和。
如果您需要输出作为列表而不是通用的可迭代,您需要在该调用中构造列表,或者将您的调用包装在列表中的Z(Q):list(Z(Q))
修改强>
仔细观察(并安装正确的库...)后,我的原始答案似乎不正确。堆栈跟踪(理想情况下会包含在您的问题中:))指向Z本身的返回行。这是因为您的原始代码每次迭代sum
时都会尝试调用range(len(p))
,而不是在所有结果上运行一次。
您可以调整代码,通过移动外部函数来正确返回单个求和值,即:
import numpy as np
import scipy.stats as stats
from scipy.stats import poisson, norm
cs = 100
co = 300
mu = 4.7
G = poisson(mu)
p = G.pmf(np.arange(3*mu))
# Define Z(Q) function
def Z(Q):
for i in range(len(p)):
yield p[i]*cs*max((Q-i), 0) + p[i]*co*max((i-Q), 0)
# Plot Q and (Q)
import pylab as pl
x = []
y = []
for Q in range(0, 12):
x.append(Q)
y.append(sum(Z(Q)))
pl.plot(x, y, '-o')
pl.show()
总结一下这些变化:
Z(Q)
现在产生函数的每次迭代,如上所述sum
操作现在在Z(Q)
我希望有所帮助!