将不规则形状的数组导入Python

时间:2019-03-09 00:00:33

标签: python arrays numpy wolfram-mathematica

我在Mathematica中生成了一些数据,需要将这些数据导入Python。数据的生成方式依赖于符号计算,因此简单地在Python中生成数据就不成问题了。数据是一个维度数组(126,2),但是每个元素的第一个位置是整数,第二个位置是列表列表,并且每个元素的维度都不恒定,例如:

`
    {
    {-9,{{4,2},{5,6},{8,10}}},
    {-2,{{3,6},{6,1}}}
    {4,{{3,6},{6,1},{3,6},{6,1},{3,6},{6,1},{3,6},{6,1}}}
    }
`

将是前三个元素。每个元素中的第二个位置将始终是二维列表的列表。这里的目标是将这些数据作为numpy数组导入,这样我就可以调用每个元素,无论其位置如何。

我在numpy.genfromtxt("data.txt",delimiters="}}}")上取得了一些成功,它为我提供了正确的形状(126,2),但是每个元素都只是“ nan”。

我在...上获得了更多成功

`
with open("data.csv") as csvfile:
     reader = csv.reader(csvfile, delimiter=' ')
     for element in reader:
         print(np.asarray(element)[0])
`

这给了我整数值作为数组,这太好了!对于我尝试过的每个元素的第二个位置:

`
def replace_all(text, dic):
    for i, j in dic.items():
        text = text.replace(i, j)
    return text
d={"{":"[","}":"]"}
with open("spinweights.csv") as csvfile:
     reader = csv.reader(csvfile, delimiter=',')
     it=0
     for element in reader:
         while it<1:
             curlToSq=replace_all(str(element[1]),d)
             print(np.asarray(curlToSq))
`

replace_all函数将所有花括号都更改为方括号的情况下(此处的想法是,这将使转换为numpy数组更加容易)。那里的最后一行返回一个数组... ... shape(),没有对象可以下标,这就是我所需要的!

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我认为将其转换为列表结构最简单。

我在下面添加了,

In [22]: astr=""" { 
    ...:     {-9,{{4,2},{5,6},{8,10}}}, 
    ...:     {-2,{{3,6},{6,1}}}, 
    ...:     {4,{{3,6},{6,1},{3,6},{6,1},{3,6},{6,1},{3,6},{6,1}}} 
    ...:     }"""                                                               
In [23]: astr1=astr.replace('{','[').replace('}',']').replace('\n','')          
In [24]: astr1                                                                  
Out[24]: ' [    [-9,[[4,2],[5,6],[8,10]]],    [-2,[[3,6],[6,1]]],    [4,[[3,6],[6,1],[3,6],[6,1],[3,6],[6,1],[3,6],[6,1]]]    ]'

各种字符串评估器。 eval始终可用。 ast比较安全。 json.loads(astr1)也可以。

In [25]: alist= eval(astr1)                                                     
In [26]: alist                                                                  
Out[26]: 
[[-9, [[4, 2], [5, 6], [8, 10]]],
 [-2, [[3, 6], [6, 1]]],
 [4, [[3, 6], [6, 1], [3, 6], [6, 1], [3, 6], [6, 1], [3, 6], [6, 1]]]]

如果必须是数组,请执行以下操作:

In [27]: arr = np.array(alist)                                                  
In [28]: arr                                                                    
Out[28]: 
array([[-9, list([[4, 2], [5, 6], [8, 10]])],
       [-2, list([[3, 6], [6, 1]])],
       [4,
        list([[3, 6], [6, 1], [3, 6], [6, 1], [3, 6], [6, 1], [3, 6], [6, 1]])]],
      dtype=object)

这是(3,2)。 arr[:,0]是整数数组,而arr[:,1]是列表数组。

genfromtxt作为默认值尝试将输入转换为浮点数(它可以转换的内容变为nan)。它用于csv-整齐的字符串数表,每行的列数相等。

答案 1 :(得分:1)

您可以将Export"JSON""PythonExpression"结合使用,以将数据导出到文件中。这些都可以由Python直接读取。

下面我用ExportString进行演示。

使用

x =
 {
  {-9, {{4, 2}, {5, 6}, {8, 10}}},
  {-2, {{3, 6}, {6, 1}}},
  {4, {{3, 6}, {6, 1}, {3, 6}, {6, 1}, {3, 6}, {6, 1}, {3, 6}, {6, 1}}}
  };

然后

ExportString[x, "JSON", "Compact" -> True]
[[-9,[[4,2],[5,6],[8,10]]],[-2,[[3,6],[6,1]]],[4,[[3,6],[6,1],[3,6],[6,1],[3,6],[6,1],[3,6],[6,1]]]]

ExportString[x, "PythonExpression"]
[[-9, [[4, 2], [5, 6], [8, 10]]], [-2, [[3, 6], [6, 1]]], [4, [[3, 6], [6, 1], [3, 6], [6, 1], [3, 6], [6, 1], [3, 6], [6, 1]]]]

Wolfram语言(又称Mathematica)可以导入和导出many formats,其中上面两个是它支持的Basic Formats。通常不需要定制输出的代码消耗,因为通常存在其他平台可以幼稚(或具有要读取的库)的可用格式。

希望这会有所帮助。