【问题标题】:Fastest way to add noise to a numpy array向 numpy 数组添加噪声的最快方法
【发布时间】:2017-10-30 16:10:56
【问题描述】:

我有一个代表图像的 numpy.ndarray,我想给它添加随机噪声。我已经做了一些测试,到目前为止我最快的解决方案是:

def RandomNoise(x):
    x += np.random.random(x.shape)

但是当我有大图像/数组时,这个解决方案仍然太慢了。最快的方法是什么?

【问题讨论】:

  • 如果x 是图像,那么我假设它都是整数(如RGB 输出)? np.random.random 返回一个浮点数,因此您的开销可能会花在将所有内容转换为浮点数上。
  • 不会比这更快了。您需要prod(x.shape) 很多随机数,而np.random.rand 是这里最快的。对于将一个数组添加到另一个数组,没有什么比+ 更好的了。让我补充一点,如果这是您的应用程序的瓶颈,我会感到惊讶。
  • 感谢 cmets,但就我而言,我必须使用 float :-(

标签: python numpy numpy-random


【解决方案1】:

加快速度的最简单方法是避免分配您实际上不需要的随机数组。为避免这种情况,请使用 Numba:

import numba
import random

@numba.njit
def RandomNoise2(x):
    x = x.reshape(-1) # flat view
    for ii in range(len(x)):
        x[ii] += random.random()

对于像 400 万个元素这样的中等大小的数组,在第一次运行 JIT 编译代码后,这会稍微快一些。对于像 2000 万个值这样的较大数组,它的速度是原来的两倍,甚至更多。如果您的内存不足,则速度会大大提高,因为它可以避免交换。

【讨论】:

  • 非常感谢您的回答。我不是 python 专家,所以我对 x = x.ravel() 这一行感到惊讶。你不修改x的形状吗?
  • 我猜是因为我的数组有 3 个维度(一堆图像),所以我可能可以使用多线程加快处理速度。
  • 我已经对一个数组 [27, 1600, 1600] 做了测试,所以大约有 6900 万个浮点数,处理时间从 2.7s 下降到 1.5s,几乎快了两倍。
  • @FiReTiTi:测试时,请确保多次运行该函数。由于 JIT 编译,第一次运行会比较慢。关于 ravel(),我意识到更好更清晰的方法是reshape(-1),所以我将更新答案以使用它。它通常不会复制输入。
  • @FiReTiTi:无论如何它不会“修改 x” - 请注意我将变量 x 重新分配给 ravel/reshape 的结果。如果您希望更清楚,您可以在函数中使用不同的变量名称,例如 y 除了x.reshape(-1)
猜你喜欢
  • 2018-03-05
  • 2019-04-04
  • 2014-07-16
  • 2021-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多