You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将动态字符串变量传入np.array函数,使其解析为表达式数组?

动态字符串表达式转为numpy数组参数的解决方案

问题场景

有动态生成的字符串变量my,示例值如下:

my = "~obr0.isnull(), ~obr1.isnull(), ~obr2.isnull(), ~obr3.isnull(), ~obr4.isnull()"

需要实现:执行itog = np.any(np.array([my]), axis=0)时,效果完全等效于直接编写如下代码:

itog = np.any(np.array([~obr0.isnull(), ~obr1.isnull(), ~obr2.isnull(), ~obr3.isnull(), ~obr4.isnull()]), axis=0)

此前尝试np.fromstring出现弃用警告,改用np.frombuffer触发类型错误,核心原因是这两个方法用于处理二进制/字符串的字节内容,无法解析Python表达式。

可行解决方案

方法1:直接使用eval执行表达式

将字符串中的内容作为Python表达式执行,生成对应的列表后转为numpy数组:

import numpy as np

# 前提:obr0~obr4是已定义的pandas对象(如Series/DataFrame)
expr_list = eval(f"[{my}]")
itog = np.any(np.array(expr_list), axis=0)

注意:eval会执行字符串中的任意代码,若my来自不可信来源,存在安全风险。

方法2:安全的表达式解析(利用ast模块)

如果my的来源不可控,先用ast模块验证表达式安全性,再执行:

import ast
import numpy as np

# 解析表达式
tree = ast.parse(f"[{my}]", mode='eval')

# 验证表达式(示例:仅允许调用isnull()方法)
for node in ast.walk(tree):
    if isinstance(node, ast.Call):
        if not (isinstance(node.func, ast.Attribute) and node.func.attr == 'isnull'):
            raise ValueError("仅允许调用isnull()方法")

# 安全执行表达式
expr_list = eval(compile(tree, filename='', mode='eval'))
itog = np.any(np.array(expr_list), axis=0)

这种方式能有效避免执行恶意代码,安全性更高。

方法3:通过变量名规律生成列表(无字符串解析)

如果变量命名有规律(如obr0到obrN),直接通过变量名获取对象生成表达式列表:

import numpy as np

# 从当前作用域获取所有obr开头的变量
obrs = [locals()[f"obr{i}"] for i in range(5)]
expr_list = [~obr.isnull() for obr in obrs]
itog = np.any(np.array(expr_list), axis=0)

此方法无需解析字符串,安全且可读性强,适合变量命名有规律的场景。

内容的提问来源于stack exchange,提问作者victor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 00:00:26