如何修改这个Python定义函数代码?
How to modify this Python define function code?
谁能看看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) returns 对范围 (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)
如果您期望 Z(Q) 为 return 多个值,您可能需要使用 "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))
这将允许对其进行迭代,并将 return for 循环的每个 运行 的总和。
如果您需要将输出作为列表而不是通用的可迭代对象,则需要在该调用中构建列表,或者将对 Z(Q) 的调用包装在列表中:list(Z(Q ))
编辑:
仔细查看(并安装正确的库...)后,我原来的答案似乎不正确。堆栈跟踪(最好包含在您的问题中:))指向 Z 本身的 return 行。这是因为您的原始代码在每次迭代 range(len(p))
时都试图 运行 调用 sum
而不是 运行 在所有结果上调用一次。
您可以调整您的代码以正确地执行 return 单个求和值,方法是将求和 移到 函数之外,即:
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)
的结果
希望对您有所帮助!
谁能看看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) returns 对范围 (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)
如果您期望 Z(Q) 为 return 多个值,您可能需要使用 "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))
这将允许对其进行迭代,并将 return for 循环的每个 运行 的总和。
如果您需要将输出作为列表而不是通用的可迭代对象,则需要在该调用中构建列表,或者将对 Z(Q) 的调用包装在列表中:list(Z(Q ))
编辑:
仔细查看(并安装正确的库...)后,我原来的答案似乎不正确。堆栈跟踪(最好包含在您的问题中:))指向 Z 本身的 return 行。这是因为您的原始代码在每次迭代 range(len(p))
时都试图 运行 调用 sum
而不是 运行 在所有结果上调用一次。
您可以调整您的代码以正确地执行 return 单个求和值,方法是将求和 移到 函数之外,即:
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)
的结果
希望对您有所帮助!