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

将不规则形状的数组导入Python,python,arrays,numpy,wolfram-mathematica,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

我有一些用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))
`
`
def replace_all(文本,驾驶员信息中心):
对于dic.items()中的i,j:
text=text.替换(i,j)
返回文本
d={“{”:“[”,“}”:“]”}
打开(“spinweights.csv”)作为csvfile:
reader=csv.reader(csvfile,分隔符=',')
它=0
对于reader中的元素:

虽然它我认为将其转换为列表结构将是最简单的

我在下面添加了一个

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]]]    ]'
它们是各种字符串计算器<代码>评估
始终可用<代码>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
——一个整洁的字符串数表,每行的列数相等

您可以与或一起使用,将数据导出到文件中。Python可以直接读取其中任何一个

下面是我用来演示的

然后

Wolfram语言(又称Mathematica)可以导入和导出,上面两个是它支持的。通常不需要定制输出的代码消耗,因为通常有一种其他平台可以简单地(或有一个库)读取的可用格式


希望这有帮助。

这很有帮助!不幸的是,我在将它作为一个带有可下标元素的数组引入Python时仍然遇到问题。我已将其导入为numpy nd数组(已检查类型),但其形状为()。有什么想法吗?复制和粘贴会起作用,但是…@BrendanReid可能会尝试以该格式导出,看看是否有Python库可以导入该格式。否则,请询问如何将JSON数组导入Python数组。你应该得到更多关于这个问题的答案。
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]]]]