我在自己的名为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 :(得分:0)
Python 3&#39; s input
返回str
,它不会解析它来制作Python数据结构只是因为内容看起来像Python文字。在这种情况下,如果您希望能够输入list
list
int
的{{1}}字面值,我建议您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
可以在不允许任意代码执行的情况下为您提供所需的内容。