检查该数组不包含负数,如果有,则再次运行函数

时间:2015-07-16 18:13:21

标签: python arrays numbers output

我今天的任务是创建一种检查函数输出是否包含负数的方法,如果是,则必须运行该函数,直到它不包含负数。

我稍后会在帖子中发布完整代码,但这是我尝试解决的问题:

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

谢谢!

1 个答案:

答案 0 :(得分:2)

您尚未在函数evectors的范围内声明变量evecs

evectors = evecs(matrixTranspose)

if any(x<0 for x in evectors) == False:
    print(evectors)

修改

有几个问题:

  1. 缩进在Python中非常重要。 MarkovChainevecs是两个独立的功能。您的evacs函数缩进了一个额外的级别,并将其嵌入MarkovChain

  2. 如果您计划在另一个函数调用中使用它,则
  3. MarkovChain应返回matrixTransponse

  4. 由于上述问题,您对MarkovChain的函数调用需要分配给变量matrixTranponse,否则您会收到错误消息,指出matrixTranspose当您使用它调用evecs函数时,未定义。

  5. 由于在完成对matrixTranspose的函数调用之前未设置变量MarkovChain的初始化,因此需要重新排序逻辑的其余部分。

  6. 我已在下面应用了以上所有更改,并在更改的区域添加了注释:

    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)