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