什么是矢量化?

时间:2017-12-11 14:49:23

标签: python python-3.x numpy vectorization

在Python中对for循环进行矢量化是什么意思?有没有其他方法可以编写嵌套的for循环?

我是Python的新手,在我的研究中,我总是遇到NumPy库。希望可以有人帮帮我。

2 个答案:

答案 0 :(得分:17)

Python for循环本质上比它们的C对应慢。

这就是numpynumpy数组上提供矢量化操作的原因。它将您通常在Python中执行的for循环推送到C级别,这要快得多。 numpy提供了矢量化(" C级for循环")替代方案,否则需要以元素方式完成(" Python级{{1循环)。

for

import numpy as np from timeit import Timer li = list(range(500000)) nump_arr = np.array(li) def python_for(): return [num + 1 for num in li] def numpy_add(): return nump_arr + 1 print(min(Timer(python_for).repeat(10, 10))) print(min(Timer(numpy_add).repeat(10, 10))) # 0.725692612368003 # 0.010465986942008954 矢量化加法的速度提高了70倍。

答案 1 :(得分:9)

这是来自Wes McKinney的definition

  

数组非常重要,因为它们可以让您表达批处理   对数据的操作,无需编写任何for循环。这通常是   称为矢量化。等大小之间的任何算术运算   数组应用元素运算。

矢量化版本:

>>> import numpy as np
>>> arr = np.array([[1., 2., 3.], [4., 5., 6.]])
>>> arr * arr
array([[  1.,   4.,   9.],
       [ 16.,  25.,  36.]])

与原生Python(嵌套)列表上的循环相同:

>>> arr = arr.tolist()
>>> res = [[0., 0., 0.], [0., 0., 0.]]
>>> for idx1, row in enumerate(arr):
        for idx2, val2 in enumerate(row):
            res[idx1][idx2] = val2 * val2
>>> res
[[1.0, 4.0, 9.0], [16.0, 25.0, 36.0]]

这两项操作如何比较? NumPy版本需要436 ns; Python版本需要3.52μs(3520 ns)。 “小”时间的这种巨大差异称为微观性能,当您处理大数据或重复操作数千次或数百万次时,它变得非常重要。