是否有任何预先实现的功能从用户通过控制台获取N * N矩阵?
答案 0 :(得分:0)
没有原生方法。 例如,您可以使用:每行1个矩阵行,使用行中数字之间的分隔符。就像这样。
matrix = []
DEFAULT_VALUE = 3
DELIMITER = ' '
try:
N = int(input("Enter N:"))
except:
print("Parsing error. Default N = 3")
N = DEFAULT_VALUE
i = 0
while i < N:
row = input("Enter row %d (cell delimiter: '%s'): " % (i + 1, DELIMITER))
try:
parsed_row = list(map(int, row.split(DELIMITER)))
except:
print("Conversion to int error. Please repeat")
continue
if len(parsed_row) != N:
print("Please enter exactly %d numbers" % N)
continue
matrix.append(parsed_row)
i += 1
print("Your matrix:")
print("\n".join(map(lambda x: " ".join(map(lambda y: "%5d" % y, x)), matrix)))
答案 1 :(得分:0)
如果您的用户理解Python / NumPy语法,您可以让您的程序接受有效的代码作为输入:
import numpy as np
# Input from user.
# Note that surrounding [] are allowed but not necessary
s = '[1,2], [3,4]'
# Convert input to matrix
matrix = np.array(eval(s))
print(matrix)
这种方法非常强大。例如,输入'[(1,2), [3,4]]'
会产生相同的矩阵。
为了进一步提高健壮性(现在允许非法的Python语法),您可以使用
import re, numpy as np
# Input from user
s = '(1 2) (3 4)'
# Convert input to matrix
matrix = np.array(eval(re.sub('\s+', ',', s.strip())))
print(matrix)
现在可以使用空格(以及逗号,如前所述)来分隔矩阵元素。
答案 2 :(得分:0)
有多种方法可以回答这个......
好吧,如果矩阵是n * n,这意味着第一个输入行你知道输入行的数量(不,输入()不能以键输入结束按下)。所以你需要这样的东西:
arr = []
arr.append(input().split())
for x in range(len(arr[0]) - 1):
arr.append(input().split())
我使用了range(len(arr [0]) - 1)所以它输入了其余的行(因为矩阵宽度和高度相同,并且已经从输入中读取了第一行)。
我也使用.split()而没有“”作为参数,因为它是默认参数。
2.或者你可以使用这个...
>>> import math
>>> line = ' '.join(map(str, range(4*4))) # Take input from user
'0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15'
>>> items = map(int, line.split()) # convert str to int
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
>>> n = int(math.sqrt(len(items))) # len(items) should be n**2
4
>>> matrix = [ items[i*n:(i+1)*n] for i in range(n) ]
[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15]]
3
尝试这样的事情,而不是使用现有的列表逐个设置矩阵:
# take input from user in one row
nn_matrix = raw_input().split()
total_cells = len(nn_matrix)
# calculate 'n'
row_cells = int(total_cells**0.5)
# calculate rows
matrix = [nn_matrix[i:i+row_cells] for i in xrange(0, total_cells, row_cells)]
示例:
>>> nn_matrix = raw_input().split()
1 2 3 4 5 6 7 8 9
>>> total_cells = len(nn_matrix)
>>> row_cells = int(total_cells**0.5)
>>> matrix = [nn_matrix[i:i+row_cells] for i in xrange(0, total_cells, row_cells)]
>>> matrix
[['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9']]
答案 3 :(得分:0)
最接近numpy内置的是np.matrix
功能。作为MATLAB克隆,它接受一个字符串:
In [1550]: np.matrix('1 2;3 4')
Out[1550]:
matrix([[1, 2],
[3, 4]])
结果是matrix
子类,所以我建议立即将它转换为数组:
In [1551]: np.matrix('1 2;3 4').A
Out[1551]:
array([[1, 2],
[3, 4]])
与input
结婚:
In [1552]: np.matrix(input('>')).A
>1 2 3; 4 5 6
Out[1552]:
array([[1, 2, 3],
[4, 5, 6]])
这不会强制执行方形性。你必须提供这个测试。
对于小玩具输入,这应该没问题。但对于任何大事,我建议从文件中获取输入,用户可以事先编辑。
np.loadtxt
和np.genfromtxt
是从csv格式化文件创建数组的好工具。有很多关于使用它们的问题。
基本数组定义带有列表列表:
alist = [[1,2,3],[4,5,6]]
arr = np.array(alist)
所以任何可以根据用户输入构建这样一个列表的东西都可以工作。例如,您可以接受“数字”行
In [1558]: alist = ['1 2 3'.split(),'4 5 6'.split()]
In [1559]: alist
Out[1559]: [['1', '2', '3'], ['4', '5', '6']]
从此列表中生成数组会产生字符串dtype
In [1560]: np.array(alist)
Out[1560]:
array([['1', '2', '3'],
['4', '5', '6']],
dtype='<U1')
但您可以指定dtype
(作为int或float),array
将尝试转换字符串。您也可以在输入后立即将字符串转换为数字。
In [1561]: np.array(alist, dtype=int)
Out[1561]:
array([[1, 2, 3],
[4, 5, 6]])
你也可以接受[]
,但这些更难以处理。