将字符串矩阵转换为numpy

我有任意维的矩阵,其格式类似于下面的示例。它们来自外部来源,格式无法更改。

[[[1.65 0.53 0 1][0.99 1.41 0 1][0.38 1.37 0 1][0 0 1 1][1.10 0.69 0 1][0 0 1 1][0.60 1.21 0 1][0.99 1.04 0 1][1.86 1.20 0 1][0 0 1 1][1.66 0.68 0 1][0.96 0.75 0 1][0.86 0.80 0 1][1.13 0.97 0 1][1.86 1.48 0 1][0 0 1 1][0.71 1.10 0 1][1.43 0.58 0 1][1.34 0.63 0 1][1.37 1.45 0 1][0.36 1.08 0 1][0 0 1 1][0.60 1.18 0 1][1.08 0.64 0 1][0.99 0.58 0 1][1.57 1.16 0 1][0.87 1.39 0 1][0.48 1.21 0 1][0 0 0 0][0 0 0 0][0 0 0 0][0 0 0 0][0 0 0 0]][[1.52 1.01 0 1][0.93 0.62 0 1][1.41 0.52 0 1][1.66 0.83 0 1][0 0 1 1][1.02 1.03 0 1][0.98 0.92 0 1][0 0 1 1][0.65 0.90 0 1][0 0 1 1][1.27 0.61 0 1][0.41 0.79 0 1][1.23 1.04 0 1][0.56 0.70 0 1][0 0 1 1][1.81 0.90 0 1][0 0 1 1][1.71 0.57 0 1][1.53 1.06 0 1][1.28 1.42 0 1][1.50 0.91 0 1][0 0 0 0][0 0 0 0][0 0 0 0][0 0 0 0][0 0 0 0][0 0 0 0][0 0 0 0][0 0 0 0][0 0 0 0][0 0 0 0][0 0 0 0][0 0 0 0]][[0 0 1 1][0.53 1.17 0 1][0.24 0.54 0 1][1.88 0.68 0 1][0 0 1 1][1.33 0.68 0 1][0.32 0.55 0 1][1.28 0.73 0 1][0.49 1.13 0 1][1.45 1.28 0 1][0.66 1.47 0 1][0 0 1 1][0.76 1.10 0 1][1.95 0.78 0 1][0 0 1 1][0.56 0.61 0 1][0.84 1.05 0 1][1.07 0.59 0 1][1.79 0.95 0 1][1.93 1.02 0 1][1.93 1.16 0 1][0 0 1 1][0.55 0.58 0 1][0.29 1.13 0 1][1.46 0.50 0 1][0 0 0 0][0 0 0 0][0 0 0 0][0 0 0 0][0 0 0 0][0 0 0 0][0 0 0 0][0 0 0 0]][[1.71 0.50 0 1][0.70 1.35 0 1][0 0 1 1][0.90 0.83 0 1][1.81 0.97 0 1][1.64 1.35 0 1][1.21 1.15 0 1][0.54 0.50 0 1][0 0 1 1][0.62 0.72 0 1][0.86 1.38 0 1][0 0 1 1][1.76 1.15 0 1][1.83 1.43 0 1][0.20 0.51 0 1][0.81 0.65 0 1][0 0 1 1][0.51 0.79 0 1][1.09 1.43 0 1][1.65 1.03 0 1][1.47 1.49 0 1][0 0 1 1][1.57 0.97 0 1][0.99 0.93 0 1][1.82 0.66 0 1][1.84 1.01 0 1][0 0 0 0][0 0 0 0][0 0 0 0][0 0 0 0][0 0 0 0][0 0 0 0][0 0 0 0]][[0 0 1 1][1.36 0.94 0 1][1.61 0.64 0 1][0.99 1.03 0 1][1.43 1.12 0 1][1.09 1.16 0 1][0.40 1.40 0 1][0 0 1 1][0.86 0.56 0 1][0.54 0.80 0 1][0.77 1.04 0 1][0 0 1 1][1.38 0.61 0 1][0.37 1.38 0 1][1.12 1.28 0 1][0 0 1 1][1.87 0.67 0 1][1.75 0.52 0 1][0.31 0.52 0 1][0.99 0.88 0 1][0 0 1 1][1.38 1.30 0 1][0 0 0 0][0 0 0 0][0 0 0 0][0 0 0 0][0 0 0 0][0 0 0 0][0 0 0 0][0 0 0 0][0 0 0 0][0 0 0 0][0 0 0 0]]]

如何将其转换为NumPy形式?这个answer建议使用fromstring;但是,文档说这仅适用于一维矩阵。

chen321123bin1 回答:将字符串矩阵转换为numpy

取决于,如果已经是Workflows,则可以直接使用list进行转换;如果它是字符串,则可能需要先插入np.array()才能使其有效Python清单。这是一个例子,假设它是一个字符串

,

希望它会有所帮助,如果您的数据已经是列表,则可以直接跳至import ast import numpy as np myString = "<YOUR STRING ABOVE>" myString = myString.replace(" ",",") # Replace [0 0 0 0] with [0,0] myString = myString.replace("][","],[") # Replace [0,0][0,0] with [0,0],[0,0] myList = ast.literal_eval(s) # Turn string into a list myArr = np.array(myList) # Turn list into np_array

我根据上面的数据创建的数组的维度:

np.array(myList)

编辑:按@b_c的建议将eval()更改为ast.literal_eval

,

没有换行符,就是“漂亮”。

我认为最快的方法是使用正则表达式搜索/替换以空格分隔的数字之间和,之间添加][。但这不是很聪明,并且会在极端情况下中断(例如以.结尾的数字),因此您可能需要微调一下想法:

现在,在这里尝试时,这句古语再次证明自己是正确的:“如果您有一个需要正则表达式的问题,那么您将有两个问题”(未知作者)。

问题在于,由于某些数字是由一个数字组成的,因此当该数字与前面数字的逗号匹配时,正则表达式引擎无法在数字之后

因此,我们必须使用(?=...)语法进行“先看比赛”和“后看比赛”,这使人们只能匹配我们要添加“,”的地方。

之后,您将得到一个字符串,可以在其中使用“ eval”来使用嵌套列表结构,该结构可以直接传递给numpy.array

import numpy as np
import re
from ast import literal_eval

b = re.sub(r"((?<=\d)\s+(?=\d)|(?<=\])\s*?(?=\[))",a) 
c = np.array(literal_eval(b))

当然,如果数字之间总是有一个空格,并且在“] [”之间没有空格或间断,那么使用简单的字符串替换(不使用正则表达式)就容易多了。如果输入数据中的间距太小,请使用regexp。

,

我最终得到了这个

import ast
import numpy as np

def StringToMatrix(txtmat):
    txtmat = txtmat.replace(" ",").replace("][",[")
    try:
        ret = np.array(ast.literal_eval(txtmat))
    except:
        ret = None
    return ret
本文链接:https://www.f2er.com/3141425.html

大家都在问