You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

将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

火山引擎 最新活动