将Mathematica生成的不规则形状数组导入Python的技术问询
嗨,看来你在把Mathematica生成的嵌套不规则数据导入Python并转为numpy数组时碰到了瓶颈,我来给你分享几个实用的解决思路~
问题根源
你之前尝试的numpy.genfromtxt和手动替换括号后直接转numpy的方法都失效,核心原因是:
genfromtxt只适合处理规整的表格型数值数据,没法解析Mathematica这种嵌套的、维度可变的大括号结构;- 直接把替换后的字符串传给
np.asarray,numpy只会把它当成单个字符串元素,而不会解析成嵌套列表,所以才会得到形状为()的不可下标访问的对象。
最优解决方案:用ast.literal_eval解析嵌套结构
Mathematica的大括号语法和Python的中括号列表语法几乎一致,我们只需要做简单的符号替换,再用Python的ast.literal_eval把字符串解析成真实的嵌套列表,最后转成numpy的object类型数组(因为子数组维度不固定,常规numpy数组无法容纳)。
具体代码如下:
import ast import numpy as np # 读取Mathematica导出的文本文件 with open('data.txt', 'r') as f: # 读取并去除首尾空白字符 raw_data = f.read().strip() # 将Mathematica的大括号替换为Python的中括号 formatted_data = raw_data.replace('{', '[').replace('}', ']') # 把字符串解析成Python嵌套列表 python_list = ast.literal_eval(formatted_data) # 转换为numpy object数组(兼容可变维度的子元素) result_array = np.array(python_list, dtype=object) # 测试访问任意位置的元素 print("第一个元素的整数:", result_array[0][0]) print("第一个元素的二维列表:", result_array[0][1]) print("第一个二维列表的第二个子列表:", result_array[0][1][1]) # 提取子列表转为规整numpy数组做运算 sub_array = np.array(result_array[0][1]) print("子数组的形状:", sub_array.shape) # 输出 (3, 2)
额外小贴士
如果后续需要对这些子数组做批量数值运算,可以遍历result_array,把每个元素的第二部分单独转为numpy数组:
# 提取所有整数部分 integers = np.array([item[0] for item in result_array]) # 提取所有二维列表并转为numpy数组(存放在列表中) sub_arrays = [np.array(item[1]) for item in result_array]
这样就能完美满足你“访问任意位置元素”的需求啦~
内容的提问来源于stack exchange,提问作者Brendan Reid




