NumPy 中的向量化操作
Numpy 数组本质上是同质的,这意味着它是一个仅包含单一类型数据的数组。 Python 的列表和元组在它们包含的数据类型上不受限制。 NumPy 上的向量化操作的概念允许对 NumPy 数组对象和数据序列使用更优化和预编译的函数和数学运算。与简单的非向量化操作相比,输出和操作将加快速度。
示例 1:在 NumPy 数组上使用矢量化求和方法。我们将比较向量化求和方法与简单的非向量化操作,即计算 0 到 14,999 数字之和的迭代方法。
Python3
# importing the modules
import numpy as np
import timeit
# vectorized sum
print(np.sum(np.arange(15000)))
print("Time taken by vectorized sum : ", end = "")
%timeit np.sum(np.arange(15000))
# iterative sum
total = 0
for item in range(0, 15000):
total += item
a = total
print("\n" + str(a))
print("Time taken by iterative sum : ", end = "")
%timeit a
Python3
# importing the modules
import numpy as np
import timeit
import math
# vectorized operation
print("Time taken by vectorized operation : ", end = "")
%timeit np.exp(np.arange(150))
# non-vectorized operation
print("Time taken by non-vectorized operation : ", end = "")
%timeit [math.exp(item) for item in range(150)]
输出 :
与非向量化操作相比,上面的示例显示了 NumPy 的向量化操作的更优化性质。这意味着当计算效率是程序中的关键因素时,我们应该避免使用这些简单的操作,而应该使用 NumPy 向量化函数。
示例 2:这里我们将 NumPy 指数函数与Python内置数学库的指数函数进行比较,以计算特定对象中每个条目的指数值。
Python3
# importing the modules
import numpy as np
import timeit
import math
# vectorized operation
print("Time taken by vectorized operation : ", end = "")
%timeit np.exp(np.arange(150))
# non-vectorized operation
print("Time taken by non-vectorized operation : ", end = "")
%timeit [math.exp(item) for item in range(150)]
输出 :
在这里,我们可以看到 NumPy 向量化操作在计算值方面更加优化,以及Python数学库的另一个限制,即数学库范围限制,因为它不适合非常大的值,不像 NumPy 向量化操作可以用来计算非常大范围限制的指数值。
上述两个示例证明了 NumPy 向量化函数和操作的最佳性质,在比较和用于代替Python程序或脚本中的简单或非向量化函数或操作时。