【问题标题】:Optimizing checking each element of numpy array against a given condition根据给定条件优化检查numpy数组的每个元素
【发布时间】:2019-07-19 15:16:12
【问题描述】:

我有一个模拟,它在给定循环中任意多次查看 numpy 数组,以检查是否有任何元素超过了某个阈值。如果一个元素超过了阈值,我需要跟踪是哪个元素这样做了,所以我可以对那个特定的元素进行操作。我有一个功能可以做到这一点,但它是我的代码的主要瓶颈;运行模拟所花费的时间中,大约 90% 的时间都花在了执行这一功能上。

这是我的功能:

    def scanLattice(s_array,t_array,L):
        failures = []
        for i in xrange(L):
            for j in xrange(L):
                if s_array[i,j] >= t_array[i,j]:
                    M = L*j + i
                    failures.append(M)
        return failures

s_array 是要检查其值的数组;它的大小为 [L,L]。 t_array 也是 [L,L] 并保存用于检查 s_array 中的值的阈值。阈值不统一。 t_array 的随机 1% 的元素具有与数组其余部分不同的阈值,这些阈值是统一的。我跟踪这些不统一的站点。因此,我遍历s_array 的行和列并检查t_array 的相应元素,如果满足阈值条件,则将该站点的索引添加到列表中。

任何关于如何以更有效的方式重写此函数的建议将不胜感激。

【问题讨论】:

  • 看看s_array>=t_arraynp.where(s_array>=t_array)

标签: python numpy optimization simulation


【解决方案1】:

您在函数中计算的实际上是扁平数组中的索引列表,它作为多维数组的一维视图。只需计算 s_array 大于或等于 t_array 的值掩码。接下来使用 np.flatnonzero() 隐式展平非假索引上的掩码。还有一个问题。值 L*j+i 是转置数组中的展平索引,因此应用了 ndarray.T

np.flatnonzero((s_array>=t_array).T)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    相关资源
    最近更新 更多