python 中的逻辑数组和映射

logical arrays and mapping in python

我正在尝试对某些元素计算进行矢量化处理,但如果不为局部信息创建列表推导式以表示全局信息,则很难做到这一点。有人告诉我,我可以使用逻辑数组完成我想做的事情,但到目前为止,我找到的示例没有帮助。虽然是的,我可以通过列表理解来完成此操作,但速度是我的代码的主要关注点。

我有一组值指示 "global" 计算中不应调整的索引。

例如,这些 "fixed" 索引是

1 2 6

如果我的全局计算有十个元素,我将能够通过创建全局索引集的列表并减去固定索引来设置所有 "free" 值。

free = list(set(range(len(global)) - set(fixed))
[0, 3, 4, 5, 7, 8, 9]

在全局计算中,我可以调整 "free" 元素,如以下代码片段所示

global = np.ones(10)
global[free] = global[free] * 10

应该产生:

global = [10, 1, 1, 10, 10, 10, 1, 10, 10, 10]

我的"local"计算是全局计算的一个子集,其中局部图表示全局计算中对应的索引。

local_map = [4, 2, 1, 8, 6]
local_values = [40, 40, 40, 40, 40]

但我需要与本地地图关联的值来保留它们的顺序以便进行计算。

全局[免费]在本地级别的等价物是什么? 所需的输出将是这样的:

local_free = list(set(range(len(local)) - set(fixed))
local_values[local_free] *= 10
OUTPUT: local_values = [400,  40, 40, 400, 40]

如果问题格式已关闭,我深表歉意,代码块格式似乎在我的浏览器中不起作用,所以如果您需要说明,请告诉我。

对于此类与比较相关的操作,NumPy 拥有 np.setdiff1d and np.in1d 等工具。要解决我们的案子,这两个就足够了。我假设输入是 NumPy 数组,这样我们就可以使用 NumPy 支持的向量化索引方法。

对于第一种情况,我们有 -

In [97]: fixed = np.array([1,2,6])
    ...: global_arr = np.array([10, 1, 1, 10, 10, 10, 1, 10, 10, 10])
    ...: 

要在 NumPy 中获得 list(set(range(len(global_arr)) - set(fixed)) 的等价物,我们可以使用 np.setdiff1d -

In [98]: np.setdiff1d(np.arange(len(global_arr)),fixed)
Out[98]: array([0, 3, 4, 5, 7, 8, 9])

接下来,我们有-

In [99]: local_map = np.array([4, 2, 1, 8, 6])
    ...: local_values = np.array([42, 40, 48, 41, 43])
    ...: 

我们试图获得 -

local_free = list(set(range(len(local)) - set(fixed))
local_values[local_free] *= 10

在这里,我们可以使用 np.in1d 来获得一个与 local_free 等效的掩码,可用于使用 NumPy 的 boolean-indexinglocal_values 进行索引和赋值方法-

In [100]: local_free = ~np.in1d(local_map,fixed)
     ...: local_values[local_free] *= 10
     ...: 

In [101]: local_values
Out[101]: array([420,  40,  48, 410,  43])