NumPy 向量化涉及对整个数组执行数学运算,无需遍历单个元素。
我们将概述 NumPy 向量化,并通过示例展示其优势。
NumPy 矢量化
我们已经在 NumPy 中多次使用过向量化的概念。它指的是对数组执行逐元素操作。
让我们看一个简单的例子。当我们用一个数字和一个 NumPy 数组相加时,它会加到数组的每个元素上。
import numpy as np
array1 = np.array([1, 2, 3, 4, 5 ])
number = 10
# number sums up with each array element
result = array1 + number
print(result)
输出
[11 12 13 14 15]
这里,数字 10 加到了每个数组元素上。这之所以可能,是因为向量化。
没有向量化,执行该操作将需要使用循环。
示例:NumPy 向量化将两个数组相加
import numpy as np
# define two 2D arrays
array1 = np.array([[1, 2, 3], [4, 5, 6]])
array2 = np.array([[0, 1, 2], [0, 1, 2]])
# add two arrays (vectorization)
array_sum = array1 + array2
print("Sum between two arrays:\n", array_sum)
输出
Sum between two arrays: [[1 3 5] [4 6 8]]
在此示例中,我们创建了两个二维数组 array1 和 array2,并将它们相加。
这是一个向量化操作,其中两个数组的对应元素被逐个相加。
NumPy 向量化与 Python for 循环
尽管 NumPy 是一个 Python 库,但它从 C 语言继承了向量化。由于 C 语言在速度和内存方面效率很高,因此 NumPy 向量化也比 Python 快得多。
让我们比较执行向量化操作与执行等效的基于循环的操作所需的时间。
Python for 循环
import time
start = time.time()
array1 = [1, 2, 3, 4, 5]
for i in range(len(array1)):
array1[i] += 10
end = time.time()
print("For loop time:", end - start)
输出
For loop time: 4.76837158203125e-06
NumPy 矢量化
import numpy as np
import time
start = time.time()
array1 = np.array([1, 2, 3, 4, 5 ])
result = array1 + 10
end = time.time()
print("Vectorization time:", end - start)
输出
Vectorization time: 1.5020370483398438e-05
在这里,即使是简单的操作,向量化和 for 循环之间的执行时间差异也很显著。
此比较说明了向量化的性能优势,尤其是在处理大型数据集时。
NumPy Vectorize() 函数
在 NumPy 中,所有与数组的数学运算都是自动向量化的。所以我们不总是需要使用 vectorize()
函数。
让我们考虑一个场景。您有一个数组和一个返回正数平方的函数。
import numpy as np
# array
array1 = np.array([-1, 0, 2, 3, 4])
# function that returns the square of a positive number
def find_square(x):
if x < 0:
return 0
else:
return x ** 2
现在,要将函数 find_square()
应用于 array1,我们有两个选择:使用循环或向量化操作。
由于循环本质上复杂且速度慢,因此使用 vectorize()
是高效且方便的。
让我们看一个例子。
import numpy as np
# array whose square we need to find
array1 = np.array([-1, 0, 2, 3, 4])
# function to find the square
def find_square(x):
if x < 0:
return 0
else:
return x ** 2
# vectorize() to vectorize the function find_square()
vectorized_function = np.vectorize(find_square)
# passing an array to a vectorized function
result = vectorized_function(array1)
print(result)
输出
[ 0 0 4 9 16]
在此示例中,我们使用 vectorize()
函数对 find_square()
函数进行了向量化。然后我们将 array1 作为参数传递给向量化函数。