NumPy中的矢量操作
Numpy数组在本质上是同质的,意味着它是一个只包含单一类型数据的数组。Python的列表和图元在它们包含的数据类型上是不受限制的。NumPy上的矢量操作的概念允许在NumPy数组对象和数据序列上使用更优化和预编译的函数和数学操作。与简单的非矢量化操作相比,输出和操作的速度会加快。
实例1:在NumPy数组上使用矢量求和方法。我们将比较矢量求和法与简单的非矢量操作,即迭代法来计算0-14999的数字之和。
# 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
输出 :
上面的例子显示了NumPy的矢量化操作与非矢量化操作相比,具有更优的性质。这意味着当计算效率是程序的关键因素时,我们应该避免使用这些简单的操作,而应该使用NumPy的矢量化函数。
例子2:这里我们将比较NumPy指数函数和Python内置数学库的指数函数,以计算特定对象中每个条目的指数值。
# 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程序或脚本中比较和使用简单或非矢量函数或操作时。