我正在研究secretary problem,我写了以下代码:
import numpy as np
import matplotlib.pyplot as plt
def calc_probability(r,n):
sum = 0
for x in range(r,n):
sum += 1 / (x - 1)
return sum*((r - 1)/n)
def calc_optimal_k(n):
k = 0
probability_k = 0
for r in range(2,n):
if (calc_probability(r,n) > probability_k):
probability_k = calc_probability(r,n)
k = r
return k
x = np.arange(5,50,1)
plt.plot(x,calc_optimal_k(x))
plt.show()
我想为n = 5,...,50绘制calc_optimal_k(),但是当我运行此脚本时,我收到以下错误:
line 12, in calc_optimal_k
for r in range(2,n):
TypeError: only integer scalar arrays can be converted to a scalar index
显然我的x表格不正确。我查看了下面的example,我读到x需要是一系列标量,所以我不明白我做错了什么。如果x = [5,6,...]那么函数calc_optimal_k应该可以正常工作吗? (我显然错了)
我尝试过不同的方法来编写x,但似乎没有任何帮助。当我定义x = 5时,我没有收到错误,但我的图表看起来像这样
哪不能让我到处..
问题:如何绘制我的函数calc_optimal_k for x = 5,6,...,50?
谢谢!
答案 0 :(得分:1)
您正在使用numpy数组调用函数,但它需要标量n
。您可以通过使用标量调用它来解决此问题:
import numpy as np
import matplotlib.pyplot as plt
def calc_probability(r,n):
sum = 0
for x in range(r,n):
sum += 1 / (x - 1)
return sum*((r - 1)/n)
def calc_optimal_k(n):
k = 0
probability_k = 0
for r in range(2,n):
if (calc_probability(r,n) > probability_k):
probability_k = calc_probability(r,n)
k = r
return k
x = np.arange(5,50,1)
y = np.array([calc_optimal_k(n) for n in x])
plt.plot(x, y)
plt.show()
我不确定,为什么x
(因此我的y
)首先是一个numpy数组。如果要使用矢量化方法,则必须在被调用函数中使用numpy's math library。否则,数学库将尝试将数组转换为标量,只有长度为1的数组才能使用。