从一串以空格分隔的数字建立一个矩阵



我有一个字符串中的数字列表,由空格分隔x="1 2 3 4 5 6 7 8 9 9 10 11…">
我想从这个字符串中提取3x3矩阵(列表的列表),所以上面的字符串应该产生输出=[[[[1,2,3],[4,5,6],[7,8,9]],[[10,11,12],[13,14,15],[16,17,18]]…
我尝试在变量x上使用split函数并循环它以构建最终输出,但它变得混乱。Is there a simple way to do it in simple python or using some library?
我们可以假设元素的数量与将其分成3x3一致,并且数字之间用单个空格分隔

使用NymPy,这很容易。

首先,使用str.split()获取数字列表,将它们转换为整型(如果需要,也可以将其转换为浮点数),然后重塑数组:

import numpy as np
s = '0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17'
a = np.array([int(x) for x in s.split()]).reshape((-1,3))

收益率

array([[ 0,  1,  2],
[ 3,  4,  5],
[ 6,  7,  8],
[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17]])

,

a = np.array([int(x) for x in s.split()]).reshape((3,-1))

收益率

array([[ 0,  1,  2,  3,  4,  5],
[ 6,  7,  8,  9, 10, 11],
[12, 13, 14, 15, 16, 17]])

如果你知道结果的两个维度,将它们显式地传递给reshape()而不是我的-1(这意味着一个维度未指定)。

从这个答案中获取chunk-实现,您只需应用两次即可获得3x3矩阵:

from itertools import zip_longest
def chunk(source, n):
return zip_longest(*([iter(source)] * n))
string = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18"
matrix = list(chunk(chunk(string.split(" "), 3), 3))
print(matrix)
x = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18"
x_arr = [int(el) for el in x.split(" ")]
def foo(arr, n):
return [arr[i:(i + n)] for i in range(0, len(arr), n)]
[foo(el, 3) for el in foo(x_arr, 9)]
# [[[1, 2, 3], [4, 5, 6], [7, 8, 9]], [[10, 11, 12], [13, 14, 15], [16, 17, 18]]]

可能有一个库可以很容易地做到这一点。

使用numpy:

  1. 将字符串解析为每3个元素的集合,或者在每3个元素后插入分号。
  2. 使用numpy的矩阵运算,np.matrix()对每组三个。
  3. 使用控制结构,一次只能操作3组元素。

你可以把你的向量分成适当大小的块,并使用numpy的重塑:

vector = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18"
n = 3
matrix_size = 3*3
vector = np.array([int(x) for x in vector.split()])
matrixes = [vector[i-matrix_size:i].reshape((n,n)) for i in range(matrix_size,len(vector)+1,matrix_size)]
matrixes
[array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]),
array([[10, 11, 12],
[13, 14, 15],
[16, 17, 18]])]

最新更新