将不规则形状的数组导入Python
我有一些用Mathematica生成的数据,需要导入Python。数据的生成方式依赖于符号计算,因此不可能用Python简单地生成数据。数据是一个维度数组(126,2),但如果每个元素中的第一个位置是整数,则第二个位置是列表列表,并且元素之间的维度不是恒定的,例如:将不规则形状的数组导入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
`
{
{-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]]]]