我今天的任务是创建一种检查函数输出是否包含负数的方法,如果是,则必须运行该函数,直到它不包含负数。
我稍后会在帖子中发布完整代码,但这是我尝试解决的问题:
def evecs(matrixTranspose):
evectors = numpy.linalg.eig(matrixTranspose)[1][:,0]
return evectors
if any(x<0 for x in evectors) == False:
print(evectors)
evecs()是我的函数,evectors是输出数组,但我只想在没有负数条目的情况下打印evectors。我还想稍后补充说,如果其中是否定条目,代码应该再次运行evecs函数,直到它找到没有负数条目的evectors。
然而,每当我运行它时,我都会收到错误:
未定义全局名称evectors
这是我的代码的链接,以及iPython控制台的完整输出。 http://pastebin.com/3Bk9h1gq
谢谢!
答案 0 :(得分:2)
您尚未在函数evectors
的范围内声明变量evecs
。
evectors = evecs(matrixTranspose)
if any(x<0 for x in evectors) == False:
print(evectors)
修改强>
有几个问题:
缩进在Python中非常重要。 MarkovChain
和evecs
是两个独立的功能。您的evacs
函数缩进了一个额外的级别,并将其嵌入MarkovChain
。
MarkovChain
应返回matrixTransponse
。
由于上述问题,您对MarkovChain
的函数调用需要分配给变量matrixTranponse
,否则您会收到错误消息,指出matrixTranspose
当您使用它调用evecs
函数时,未定义。
由于在完成对matrixTranspose
的函数调用之前未设置变量MarkovChain
的初始化,因此需要重新排序逻辑的其余部分。
我已在下面应用了以上所有更改,并在更改的区域添加了注释:
def MarkovChain(n,s) :
"""
"""
matrix = []
for l in range(n) :
lineLst = []
sum = 0
crtPrec = precision
for i in range(n-1) :
val = random.randrange(crtPrec)
sum += val
lineLst.append(float(val)/precision)
crtPrec -= val
lineLst.append(float(precision - sum)/precision)
matrix2 = matrix.append(lineLst)
print("The intial probability matrix.")
print(tabulate(matrix))
matrix_n = numpy.linalg.matrix_power(matrix, s)
print("The final probability matrix.")
print(tabulate(matrix_n))
matrixTranspose = zip(*matrix_n)
return matrixTransponse # issue 2
# issue 1
def evecs(matrixTranspose):
evectors = numpy.linalg.eig(matrixTranspose)[1][:,0]
return evectors
matrixTranponse = MarkovChain(4, 10000000000) # issue 3
# issue 4
evectors = evecs(matrixTranspose)
if any(x<0 for x in evectors) == False:
print(evectors)