如何使用来自单独调用函数的值快速填充numpy数组

Max*_*xis 9 python numpy python-3.x

我想用生成的值填充一个numpy数组。这些值由生成器函数生成。数组长度不是太长,通常小于100,但是此数组生成了很多次,因此我想知道是否可以通过使用一些numpy来优化它。

到目前为止,我已经可以使用香草python做到这一点:

def generate():
   return generated_data

array = np.asarray([generate() for _ in range(array_length)])
Run Code Online (Sandbox Code Playgroud)

我也尝试使用np.full(shape, fill_value)

np.full((array_length, generated_data_size), generate())
Run Code Online (Sandbox Code Playgroud)

但这仅调用generate()一次函数,而不是对数组中的每个索引调用一次。

我也尝试过np.vectorize(),但无法使它生成适当形状的数组。

use*_*ica 6

NumPy 无法加速重复调用未设计用于与 NumPy 交互的函数的过程。

\n\n

优化此问题的“numpy 的奇特用法”方法是手动重写generate函数以使用 NumPy 操作生成整个输出数组,而不是仅支持单个值。这就是 NumPy 的工作原理,以及 NumPy必须如何工作;任何涉及对每个数组单元反复调用 Python 函数的解决方案都将受到 Python 开销的限制。NumPy 只能加速 NumPy 中实际发生的工作。

\n\n

如果 NumPy 提供的操作太有限generate而无法重写,则可以选择generate使用 Cython 重写或使用@numba.jit它。这些主要有助于涉及从一个循环迭代到下一个循环迭代的复杂依赖关系的计算;它们对您无法重写的外部依赖项没有帮助。

\n\n

如果您无法重写generate,您所能做的就是尝试优化将返回值放入数组的过程。根据数组大小,您可以通过重用单个数组对象来节省一些时间:

\n\n
In [32]: %timeit x = numpy.array([random.random() for _ in range(10)])\nThe slowest run took 5.13 times longer than the fastest. This could mean that an\n intermediate result is being cached.\n100000 loops, best of 5: 5.44 \xc2\xb5s per loop\nIn [33]: %%timeit x = numpy.empty(10)\n   ....: for i in range(10):\n   ....:     x[i] = random.random()\n   ....: \nThe slowest run took 4.26 times longer than the fastest. This could mean that an\n intermediate result is being cached.\n100000 loops, best of 5: 2.88 \xc2\xb5s per loop\n
Run Code Online (Sandbox Code Playgroud)\n\n

但对于更大的数组,好处就消失了:

\n\n
In [34]: %timeit x = numpy.array([random.random() for _ in range(100)])\n10000 loops, best of 5: 21.9 \xc2\xb5s per loop\nIn [35]: %%timeit x = numpy.empty(100)\n   ....: for i in range(100):\n   ....:     x[i] = random.random()\n   ....: \n10000 loops, best of 5: 22.8 \xc2\xb5s per loop\n
Run Code Online (Sandbox Code Playgroud)\n