我想做许多随机游走并绘制它们。从初始状态istate
跳到下一个状态的功能就是iter = lambda istate: istate + np.random.uniform(-0.5, 0.5)
。
因此,给定一个NumPy数组“ arr”,其中包含每次游历的值,如果我简单地调用iter(arr)
,则函数iter
被向量化,但它对所有元素执行相同的死模。
如果我改为调用np.vectorize(iter)(arr)
,则该函数将为每个元素执行单独的掷骰。
两个向量化之间有什么区别?使用其他类型的功能时,这会影响性能吗?
答案 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 default,iter(array)
将输入数组视为读取对象。它用于获取该给定对象上的迭代器。如果将迭代器定义为返回 new 对象,它将使它迭代,以便它可以根据需要进行多次迭代。