Numpy np.power进行的额外工作
NumPy是一个Python包,用于处理大型多维数组和矩阵以及应用于数组的数值计算。NumPy的重要性不仅在于它为Python提供了高效的数组计算,而且还提供了常见的数学和统计操作函数,如np.power。np.power函数在计算数组中每个元素的指数幂时,执行一些额外的工作。本文将介绍np.power及其背后的一些细节。
阅读更多:Numpy 教程
简介
在Python 3.x版本中,np.power的用法如下所示:
np.power(base, exponent, out=None)
其中,base指代要计算其指数幂的数组或标量,exponent是指数数组或标量,out是输出结果的可选输出数组。注意,参数base和exponent可以是标量或数组。当它们是数组时,它们必须具有相同的形状或是一者的形状可以利用广播机制与另一个相适应。否则,将会抛出”ValueError”异常。
举例来说,这是一个base和exponent都是标量的例子:
import numpy as np
a = np.power(2, 3) # 2的3次方
print(a) # 输出:8
这是一个base和exponent都是数组的例子:
import numpy as np
b = np.array([2,3,4])
c = np.array([1,2,3])
d = np.power(b, c) # 计算b中元素的c的幂次方
print(d) # 输出:[ 2 9 64]
代码实现
np.power函数有一些本地优化和功能扩展,使其更加高效和灵活。
Element-wise Calculation(逐元素计算)
首先,np.power提供了逐元素计算特性。这意味着np.power函数在用指数幂计算数组元素时会逐个计算。例如,使用如下代码:
import numpy as np
b = np.array([4, 9, 16, 25])
c = np.array([0.5, 1.2, 3.4, 0.3])
d = np.power(b, c)
print(d)
输出结果为:[ 2. 20.38656132 65.48193817 2.23606798]
可以看到,这是在以指数为1个单位的基础上,逐个计算值的指数幂。由于计算机不能精确地表示所有小数(例如0.2),因此计算结果可能会出现四舍五入误差。
Broadcasting(广播机制)
广播是指当操作的两个数组具有不同形状的情况下,NumPy自动地沿着某些轴将其大小调整为相同形状的过程。广播机制使得numpy.broadcast (numpy中broadcast在此处不做详细介绍)函数成为可能。
对于np.power函数,广播机制可以帮助我们避免特征ndarrays的形状不匹配的错误。例如,我们有一个数组a,它的形状为(4,3),其中的每个值都是1-5之间的随机整数。现在想要它的平方(n) 个值。可以用如下代码实现:
import numpy as np
a = np.random.randint(1, 5, size=12).reshape(4,3)
print("A:\n", a)
b = 2
c = np.power(a, b)
print("C:\n", c)
输出结果为:
A:
[[1 4 2]
[3 3 4]
[1 2 2]
[1 3 4]]
C:
[[ 1 16 4]
[ 9 9 16 [ 1 4 4]
[ 1 9 16]]
可以看到,我们使用2作为指数来对数组a进行指数幂计算。由于broadcasting机制的存在,我们无需考虑a的形状,只需要将其作为参数传入np.power中即可。
Using Out parameter(使用Out参数)
外部参数out可以用于指示输出结果的位置。如果没有指定out参数,将会创建一个新的数组用于存储结果。当out参数被指定后,计算结果将直接存储到指定数组中,并且该数组必须与输入数列具有相同的形状,或可以通过广播机制进行兼容。
以下是示例代码:
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.zeros(3)
np.power(a, b, out=c) # 指定输出为c
print("C:\n", c)
输出结果为:[ 1. 32. 729.]。可以看到,算出的结果直接写入到了c数组中。
Computation is Faster for Integers(整型计算更快)
对于计算整型数组,np.power计算速度比浮点数快得多。这是因为在计算浮点数时,np.power首先将浮点数转换为双精度格式,才开始计算。
以下是示例代码:
import numpy as np
a = np.random.randint(1, 10, size=10000)
接下来分别对a进行不同类型的计算,并使用timeit库计算运行时间:
import timeit
# 整型计算
start_time = timeit.default_timer()
aa = np.power(a, 2)
end_time = timeit.default_timer()
print("Integer Power Computation Time: ", end_time-start_time)
# 浮点型计算
start_time = timeit.default_timer()
aa = np.power(a, 2.0)
end_time = timeit.default_timer()
print("Float Power Computation Time: ", end_time-start_time)
结果如下所示:
Integer Power Computation Time: 0.0002594759999810064
Float Power Computation Time: 0.0006143879999301043
可以看到,整型计算速度是浮点型计算速度的约2倍。因此,如果你知道数组只包含整数,建议使用整数数据类型以加快np.power计算速度。
总结
在本文中,我们介绍了np.power函数的用法和背后的一些细节。np.power提供了逐元素计算和广播机制,可以方便地计算数组中每个元素的指数幂。我们还介绍了如何使用out参数和为整数数组计算乘方以获得更高的计算速度。希望通过本文,您能更加深入地了解np.power,也能更好地使用它进行数组计算。
极客笔记