我有一个字符串中的数字列表,由空格分隔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:
- 将字符串解析为每3个元素的集合,或者在每3个元素后插入分号。
- 使用numpy的矩阵运算,np.matrix()对每组三个。
- 使用控制结构,一次只能操作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]])]