逻辑数组和python中的映射

时间:2016-10-20 10:52:20

标签: python arrays numpy mapping logical-operators

我试图对一些元素计算进行矢量化,但是在没有为全局信息创建本地信息的列表理解的情况下这样做很困难。我被告知我可以使用逻辑数组完成我想做的事情,但到目前为止,我发现的例子并没有帮助。虽然是的,我可以通过列表推导来实现这一点,速度是我的代码的主要关注点。

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

例如,这些"固定"指数是

1 2 6

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

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

在全球计算中,我可以调整"免费"元素如以下代码段所示

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

应该产生:

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

我的"当地"计算是全局计算的子集,其中本地地图指示全局计算中的相应索引。

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]

如果问题格式设置已关闭,我很抱歉,代码块格式化似乎无法在我的浏览器中运行,所以如果您需要澄清,请告诉我。

1 个答案:

答案 0 :(得分:0)

对于此类与比较相关的操作,NumPy拥有np.setdiff1dnp.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 {{3}分配到local_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])