2017-06-14 131 views
0

我在自己的文件MTG.py中定义了以下函数。它应该将邻接矩阵作为输入,并创建一个图。功能在命令行上运行,但不在脚本中

import pygraphviz as pgv 
import numpy as np 

def matrix_to_graph(M): 
    A = pgv.AGraph() 
    for i in range(0, np.shape(M)[0]): 
     for j in range(0, np.shape(M)[0]): 
      if i < j and M[i][j] == 1: 
       A.add_edge(i,j) 
    A.write('M.dot') 
    C = pgv.AGraph('M.dot') 
    C.layout() 
    C.draw('M.png') 

当我在命令行

from MTG import matrix_to_graph 
M = [[0, 1, 0, 1, 1], [1, 0, 1, 1, 0], [0, 1, 0, 0, 0], [1, 1, 0, 0, 1], [1, 0, 0, 1, 0]] 
matrix_to_graph(M) 

我得到我想要的东西,这是正确的图形打印到M.png运行。

但是,如果我添加到上面的代码(没有缩进,即函数的定义之外)

M = input("Enter an adjacency matrix:") 
matrix_to_graph(M) 

我得到的错误

for i in range(0, np.shape(M)[0]): 
IndexError: tuple index out of range 

我想这种情况正在发生,因为输入函数取什么我认为是一个矩阵,但是实际上是别的东西。我试图通过使用np.matrix(M)来解决这个问题,但是这使我的矩阵变成了1x16的向量。我对Python很陌生,我确信有1000种方法可以更好地实现这一目标,但我真的很想弄清楚为什么这种方式不起作用。

我使用的是PyCharm 2017.1.3(社区版,如果有的话)和Python 3.6。

回答

0

Python 3的input返回str,它不解析它以仅仅因为内容看起来像一个Python文字而构建Python数据结构。在这种情况下,如果你希望能够进入listlistint小号文字,我建议你向using ast.literal_eval(安全)从字符串转换代表矩阵文字的list本身:

import ast 

M = ast.literal_eval(input("Enter an adjacency matrix:")) 

您可能已经习惯了Python 2,其中input等同于在Python 3中执行eval(input(...)),但该版本的input很危险并且被删除,原因很充分; ast.literal_eval在不允许任意代码执行的情况下为您提供所需的内容。

+0

我很高兴我知道问题来自哪里,更快乐的是,解决方案非常简单。谢谢。 – Trevor

相关问题