从用户(控制台)获取n * n矩阵的最佳方法是什么?

时间:2016-12-28 16:09:10

标签: python python-3.x numpy

是否有任何预先实现的功能从用户通过控制台获取N * N矩阵?

4 个答案:

答案 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)

有多种方法可以回答这个......

  1. 好吧,如果矩阵是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. 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.loadtxtnp.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]])

你也可以接受[],但这些更难以处理。