【发布时间】:2015-03-15 02:21:22
【问题描述】:
我有一些物理模拟代码,用 python 编写并使用 numpy/scipy。分析代码显示 38% 的 CPU 时间花在一个双重嵌套的 for 循环中 - 这似乎过多,所以我一直在尝试减少它。
循环的目标是创建一个索引数组,显示一维数组的哪些元素与二维数组的元素相等。
indices[i,j] = where(1D_array == 2D_array[i,j])
例如,如果1D_array = [7.2, 2.5, 3.9] 和
2D_array = [[7.2, 2.5]
[3.9, 7.2]]
我们应该有
indices = [[0, 1]
[2, 0]]
我目前将其实现为
for i in range(ni):
for j in range(nj):
out[i, j] = (1D_array - 2D_array[i, j]).argmin()
argmin 是需要的,因为我正在处理浮点数,因此等式不一定准确。我知道一维数组中的每个数字都是唯一的,并且二维数组中的每个元素都有一个匹配项,所以这种方法给出了正确的结果。
有没有办法消除双重for循环?
注意:
我需要索引数组来执行以下操作:
f = complex_function(1D_array)
output = f[indices]
这比替代方法更快,因为 2D 数组的大小为 NxN,而 1D 数组的大小为 1xN,并且 2D 数组有许多重复值。如果有人可以提出一种不同的方式来获得相同的输出而不通过索引数组,那也可能是一个解决方案
【问题讨论】:
-
1D_array总是排序的? -
@AshwiniChaudhary,不,不是。事实上,它永远不会。我将编辑示例以删除它。
-
为此,我认为 1D_array 中的条目不会重复。为什么不用 1D_array 制作字典,将值作为键,将索引作为值? IE。
{0:7.2, 1:2.5, 2:3.9}然后你只需要将 dict 应用于数组。
标签: python arrays performance numpy indexing