在python中将字符串转换为n * n矩阵

时间:2019-02-15 01:54:21

标签: python python-3.x numpy

我是一个热爱编程的本科生。我今天遇到了一个问题,我不知道如何解决这个问题。 我在寻找“ Python-字符串到矩阵表示形式”(Python - string to matrix representation)寻求帮助,但对于这个问题我仍然感到困惑。

问题出在以下方面:

给出一串用空格分隔的数字,创建一个nxn矩阵(一个二维列表,其中的列数与行数相同)并返回它。该字符串将包含整数的理想平方数。 int()和split()函数可能有用。

示例:

输入:'1 2 3 4 5 6 7 8 9'

输出:[[1,2,3],[4,5,6],[7,8,9]]

示例2:

输入:“ 1”

输出:[[1]]

我的答案:

import numpy as np
def string_to_matrix(str_in):
    str_in_split = str_in.split()
    answer = []
    for element in str_in_split:
        newarray = []
    for number in element.split():
        newarray.append(int(number))
    answer.append(newarray)
    print (answer)

测试结果如下:

Traceback (most recent call last):
  File "/grade/run/test.py", line 20, in test_whitespace
    self.assertEqual(string_to_matrix('1      2 3   4'), [[1,2],[3,4]])
AssertionError: None != [[1, 2], [3, 4]]

Stdout:
[[4]]

以及

Traceback (most recent call last):
  File "/grade/run/test.py", line 15, in test_small
    self.assertEqual(string_to_matrix('1 2 3 4'), [[1,2],[3,4]])
AssertionError: None != [[1, 2], [3, 4]]

Stdout:
[[4]]

以及

Traceback (most recent call last):
  File "/grade/run/test.py", line 10, in test_one
    self.assertEqual(string_to_matrix('1'), [[1]])
AssertionError: None != [[1]]

Stdout:
[[1]]

以及

Traceback (most recent call last):
  File "/grade/run/test.py", line 25, in test_larger
    self.assertEqual(string_to_matrix('4 3 2 1 8 7 6 5 12 11 10 9 16 15 14 13'), [[4,3,2,1], [8,7,6,5], [12,11,10,9], [16,15,14,13]])
AssertionError: None != [[4, 3, 2, 1], [8, 7, 6, 5], [12, 11, 10, 9], [16, 15, 14, 13]]

Stdout:
[[13]]

我还是很困惑如何解决这个问题。非常感谢您的帮助!

6 个答案:

答案 0 :(得分:2)

假设您不需要Window>Freeze Panes,并且想要使用列表列表:

numpy

def string_to_matrix(str_in): nums = str_in.split() n = int(len(nums) ** 0.5) return list(map(list, zip(*[map(int, nums)] * n))) 除以任何空格,nums = str_in.split()是结果的边长,n将数字转换为整数(从字符串),map(int, nums)将数字分组zip(*[map(int, nums)] * n)n组将list(map(list, zip(*[map(int, nums)] * n)))生成的元组转换为列表。

答案 1 :(得分:1)

假设您要使其动态化。

str_in = '1 2 3 4 5 6 7 8 9'
a = str_in.split(" ")
r_shape = int(math.sqrt(len(a)))
np.array([int(x) for x in a]).reshape(r_shape, r_shape)

答案 2 :(得分:0)

使用split,创建1D numpy数组,然后使用reshape

>>> s = '1 2 3 4 5 6 7 8 9'
>>> np.array([s.split(), dtype=int).reshape(3,3)
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

如果您不知道数组的大小,但知道它是正方形(相同的宽度/高度),则可以使用math.sqrt来获取reshape的输入:

>>> import math
>>> s = '1 2 3 4 5 6 7 8 9'
>>> arr = np.array(s.split(), dtype=int)
>>> size = int(math.sqrt(len(arr)))
>>> arr.reshape(size, size)
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

答案 3 :(得分:0)

鉴于您将始终获得整数的完美平方数:

import numpy as np

input_strings = '1 2 3 4 5 6 7 8 9'
arr = np.array(input_strings.split(), dtype=int)
n = int(len(arr) ** 0.5)
arr.reshape(n, n)
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

注意:在您的情况下,str.split最好不用显式的sep,以便在数字之间使用多个空格。

答案 4 :(得分:0)

"Change User /Execute"

这就是为什么您总是得到:import numpy as np def string_to_matrix(str_in): str_in_split = str_in.split() numbers = list(map(int, str_in_split)) size = r_shape = int(np.sqrt(len(numbers))) return np.array(numbers).reshape(r_shape, r_shape)

AssertionError: None != ...验证assertEqual(A, string_to_matrix("..."))是否等于string_to_matrix返回的值。在您的代码中,您不会返回任何内容,因此它是A

另一个问题是如何拆分字符串,更简单的选择是拆分所有内容并转换为数字,然后重塑为sqrt(元素数)。假设输入长度可以拆分为一个nxn矩阵

答案 5 :(得分:-1)

import math
string = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16"
stringItems = string.split(" ")
numberOfItems = len(stringItems)
if math.sqrt(numberOfItems) - int(math.sqrt(numberOfItems)) == 0:
    width = int(math.sqrt(numberOfItems))
    array = []
    finalArray = []
    for i in range (0, width):
        for j in range (0, width):
            array.insert(j, stringItems[0])
            stringItems.pop(0)
        finalArray.insert(i, array)
        array = []
    print finalArray
else:
    print "I require a string with length equal to a square number please"