NumPy向量化与自动向量化之间的区别

时间:2019-01-10 16:30:23

标签: python numpy

我想做许多随机游走并绘制它们。从初始状态istate跳到下一个状态的功能就是iter = lambda istate: istate + np.random.uniform(-0.5, 0.5)

因此,给定一个NumPy数组“ arr”,其中包含每次游历的值,如果我简单地调用iter(arr),则函数iter被向量化,但它对所有元素执行相同的死模。 如果我改为调用np.vectorize(iter)(arr),则该函数将为每个元素执行单独的掷骰。

两个向量化之间有什么区别?使用其他类型的功能时,这会影响性能吗?

2 个答案:

答案 0 :(得分:2)

np.vectorize用于不接受ndarray作为参数的函数,并且大致是for循环,因此效率不高。例如:

a=np.arange(1e4,dtype=float)
float.hex(a)
Traceback (most recent call last):

  File "<ipython-input-27-e5cdcd882026>", line 1, in <module>
    float.hex(a)

TypeError: descriptor 'hex' requires a 'float' object but received a 'numpy.ndarray'

np.vectorize允许此操作:

%timeit np.vectorize(float.hex)(a)
14.6 ms ± 850 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

大约等于(结果和效果):

%timeit [float.hex(z) for z in a]
14.2 ms ± 666 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

但是您的iter(重命名为my_iter)在这里接受ndarrays:

def my_iter(x): return x+np.random.uniform(-.5,.5)

%timeit my_iter(a)
16.1 µs ± 1.1 µs per loop (mean ± std. dev. of 7 runs, 100000 loops each)

在这种情况下远胜于:

%timeit np.vectorize(my_iter)(a)
28.6 ms ± 6.49 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

答案 1 :(得分:0)

NumPy的vectorized operations,即 np.vectorize(iter)(array)可以用于访问的元素的较大块。提供此矢量化功能主要是为了方便,而不是为了提高性能。该实现实质上是一个for循环。另一方面,by defaultiter(array)将输入数组视为读取对象。它用于获取该给定对象上的迭代器。如果将迭代器定义为返回 new 对象,它将使它迭代,以便它可以根据需要进行多次迭代。