Numexpr: 如何使用“local_dict”和“global_dict”?

6 投票
1 回答
1882 浏览
提问于 2025-04-17 14:00

我一直在尝试学习Numexpr这个包,但网上关于如何使用它的例子非常少。能不能给我一个简单的例子,说明一下“local_dict”和“global_dict”这两个参数是怎么用的?

1 个回答

6

下面的例子可能会让你更清楚一些。首先,设置场景如下:

import numpy as np
import numexpr as ne

a = np.arange(10)
b = np.arange(10, 20)
c = np.arange(20, 30)

没有 dict

>>> def f0(a, b) :
...     a, b = 2 * a, 3 * b
...     return ne.evaluate('2*a + 3*b + c')
...
>>> f0(a, b)
array([110, 124, 138, 152, 166, 180, 194, 208, 222, 236])
>>> 4 * a + 9 * b + c
array([110, 124, 138, 152, 166, 180, 194, 208, 222, 236])

当你这样运行时,ab 是局部变量,而 c 是全局变量,这个是符合预期的。

local_dict

>>> def f1(a, b) :
...     a, b = 2 * a, 3 * b
...     return ne.evaluate('2*a + 3*b + c',
...                        local_dict={'c' : np.arange(30, 40)})
...
>>> f1(a, b)
array([ 60,  66,  72,  78,  84,  90,  96, 102, 108, 114])
>>> 2*a + 3 * b + np.arange(30, 40)
array([ 60,  66,  72,  78,  84,  90,  96, 102, 108, 114])

因为我们重新定义了 local_dict,所以 ab 不再作为局部变量出现了,因此会使用全局变量的值。而且因为 c 现在被定义为局部变量,所以全局变量的值被忽略了。

global_dict

>>> def f2(a, b) :
...     a, b = 2 * a, 3 * b
...     return ne.evaluate('2*a + 3*b + c',
...                        global_dict= {'c' : np.arange(30, 40)})
...
>>> f2(a, b)
array([120, 134, 148, 162, 176, 190, 204, 218, 232, 246])
>>> 4 * a + 9 * b + np.arange(30, 40)
array([120, 134, 148, 162, 176, 190, 204, 218, 232, 246])

在这种情况下,ab 是从默认的局部字典中获取的,而新的 c 则替代了原来的全局变量。

撰写回答