什么是矢量化?

JP *_*lav 16 python numpy vectorization python-3.x

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

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

Dee*_*ace 22

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

这就是numpynumpy数组上提供矢量化操作的原因.它将for您通常在Python中执行的循环推送到C级别,这要快得多.numpy提供矢量化("C级for循环")替代方案,否则需要以元素方式("Python级别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
Run Code Online (Sandbox Code Playgroud)

numpy矢量加快X70倍.

  • 对于任何想知道**为什么**矢量化操作(在硬件级别)更快的人都可以在[此处]找到答案(/sf/ask/2456438561/一般情况下比循环)。 (2认同)

Bra*_*mon 11

以下是Wes McKinney 的定义:

数组非常重要,因为它们使您能够在不编写任何for循环的情况下表达对数据的批处理操作.这通常称为矢量化.等大小数组之间的任何算术运算都应用元素运算.

矢量化版本:

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

与原生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]]
Run Code Online (Sandbox Code Playgroud)

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