2016-12-28 3 views

答えて

0

ネイティブメソッドはありません。 たとえば、1行につき1行の行列の間に区切り文字を使用して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))) 
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) 

を使用することができます。

0

まあこれに答えるために、複数の方法...

  1. が行列の最初の入力行で意味のn * nのであれば(あなたは、入力ラインの数を知っている(となし、それが入力のために不可能だまああり)キーを押して終了しないでください)。それは、マトリックスの幅と高さが同じであるため、行の残りの部分を(入力と1つの最初の行がすでにから読み込まれる - (1 lenが(ARR [0]))私は範囲を使用

    arr = [] 
    arr.append(input().split()) 
    for x in range(len(arr[0]) - 1): 
        arr.append(input().split()) 
    

    :だから、このようなものが必要入力)。

    また、既定のパラメータであるため、パラメータとして ""を付けずに.split()を使用しました。

    >>> 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.

    はこのような何かを試してみてください代わりに、既存のリスト(複数可)を使用して1で行列1を設定し、あなたがこれを使用することができます2.or

...:

# 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']] 
0

numpy内蔵型に最も近いのは、np.matrix functonです。 MATLABクローンとして、それは、とりわけ、受け入れ、文字列:

In [1550]: np.matrix('1 2;3 4') 
Out[1550]: 
matrix([[1, 2], 
     [3, 4]]) 

結果がmatrixサブクラスであるので、私はすぐに配列に変換をお勧めします:input

In [1551]: np.matrix('1 2;3 4').A 
Out[1551]: 
array([[1, 2], 
     [3, 4]]) 

と結婚:

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) 

だから、何でも。たとえば、あなたは、文字列DTYPE

In [1560]: np.array(alist) 
Out[1560]: 
array([['1', '2', '3'], 
     ['4', '5', '6']], 
     dtype='<U1') 

に、このリストの結果から「数字」

In [1558]: alist = ['1 2 3'.split(),'4 5 6'.split()] 
In [1559]: alist 
Out[1559]: [['1', '2', '3'], ['4', '5', '6']] 

作る配列の行を受け入れることができるが、あなたは(intやfloatとして)dtypeを指定することができますし、arrayがしようとします文字列を変換します。入力の直後に文字列を数値に変換することもできます。

In [1561]: np.array(alist, dtype=int) 
Out[1561]: 
array([[1, 2, 3], 
     [4, 5, 6]]) 

あなたは[]も受け入れることができますが、それは対処するより苦痛です。

関連する問題