python - 如何在 Python 中创建可变代码?

标签 python arrays numpy

假设您有一个结构化数组,例如如下所示:

import numpy as np


a = np.array(
    [tuple([np.random.randint(100) for _ in range(3)]) for _ in range(100)], 
    dtype=[('var1', 'i4'), ('var2', 'i4'), ('var3', 'i4')]
)

现在,我只想访问此数组的特定子集/切片。例如这样:

interval = (10, 30)
b = a[
    (a['var1'] >= interval[0]) & (a['var1'] <= interval[1])
]

到目前为止一切顺利。但是,如果我有对应于不同变量的可变数量的间隔怎么办?例如这样:

intervals = [('var1', 10, 30), ('var2', 20, 50)]

我无法对其进行硬编码,因为程序运行时间隔量会发生变化。但我想要的是这样的任意数量的间隔:

b = a[
    ((a[intervals[0][0]] >= intervals[0][1]) & (a[intervals[0][0]] <= intervals[0][2])) |
    ((a[intervals[1][0]] >= intervals[1][1]) & (a[intervals[1][0]] <= intervals[1][2]))
]

到目前为止,我唯一的想法是使用 for 循环 遍历间隔并创建一个字符串,然后可以使用 eval 执行该字符串,但我不太喜欢这个。有更好的解决办法吗?

string = 'a[((a[intervals[0][0]] >= intervals[0][1]) & (a[intervals[0][0]] ' \
         '<= intervals[0][2]))'
for i in range(len(intervals[1:])):
    string += f' | \n((a[intervals[{i+1}][0]] >= intervals[{i+1}][1]) & ' \
              f'(a[intervals[{i+1}][0]] <= intervals[{i+1}][2]))'
string += ']'

b = eval(string)

最佳答案

您不需要为此问题生成代码。使用 functools.reduce| 运算符应用于未知的一系列掩码。

import operator
from functools import reduce

mask = reduce(
    operator.__or__,  # the `|` operator
    (
        ((a[var] >= lower) & (a[var] <= upper))
        for var, lower, upper in intervals  # arbitrary number of intervals
    )
)

b = a[mask]

关于python - 如何在 Python 中创建可变代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59879316/

相关文章:

Python从.py文件中提取多行注释

PHP 简单 HTML DOM 或 Python-BSoup : which one is the easier approach?

使用 `memmove` 循环移动数组

Python数组,有条件地改变分类元素

python - 制作一个继承自 Exception 的抽象基类

python - 属性错误: module 'tensorflow._api.v1.compat.v1.nn' has no attribute 'avg_pool2d'

javascript - 在大数组上使用多个 '.filter' 调用是否会影响性能?

java - 如何用 while 循环替换 for 循环方法

python - 使用来自另一列的偏移变量在Python中检索 future 值

python - 从一组点 PYTHON 绘制拉格朗日多项式