我想用生成的值填充 numpy 数组。这些值由生成器函数生成。数组长度不太长,通常
到目前为止,我已经可以使用 vanilla python 做到这一点:
def generate():
return generated_data
array = np.asarray([generate() for _ in range(array_length)])
我也尝试过使用np.full(shape, fill_value)
:
np.full((array_length, generated_data_size), generate())
但这就是所谓的generate()
仅运行一次,而不是对数组中的每个索引运行一次。
我也尝试过np.vectorize()
,但我无法让它生成适当形状的数组。
NumPy 无法加速重复调用未设计用于与 NumPy 交互的函数的过程。
优化此问题的“numpy 的奇特用法”方法是手动重写您的generate
函数使用 NumPy 运算生成整个输出数组,而不是仅支持单个值。这就是 NumPy 的工作原理,以及 NumPy 的工作原理has上班;任何涉及对每个数组单元反复调用 Python 函数的解决方案都将受到 Python 开销的限制。 NumPy 只能加速 NumPy 中实际发生的工作。
如果NumPy提供的操作太有限而无法重写generate
就它们而言,有诸如重写之类的选项generate
与 Cython 一起,或使用@numba.jit
在上面。这些主要有助于涉及从一个循环迭代到下一个循环迭代的复杂依赖关系的计算;它们对您无法重写的外部依赖项没有帮助。
如果你不能重写generate
,您所能做的就是尝试优化将返回值放入数组的过程。根据数组大小,您可以通过重用单个数组对象来节省一些时间:
In [32]: %timeit x = numpy.array([random.random() for _ in range(10)])
The slowest run took 5.13 times longer than the fastest. This could mean that an
intermediate result is being cached.
100000 loops, best of 5: 5.44 µs per loop
In [33]: %%timeit x = numpy.empty(10)
....: for i in range(10):
....: x[i] = random.random()
....:
The slowest run took 4.26 times longer than the fastest. This could mean that an
intermediate result is being cached.
100000 loops, best of 5: 2.88 µs per loop
但对于更大的数组,好处就消失了:
In [34]: %timeit x = numpy.array([random.random() for _ in range(100)])
10000 loops, best of 5: 21.9 µs per loop
In [35]: %%timeit x = numpy.empty(100)
....: for i in range(100):
....: x[i] = random.random()
....:
10000 loops, best of 5: 22.8 µs per loop
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)