本文主要是介绍NumPy(四):数学运算【数组与标量的运算:加减乘除】【数组与数组的运算(广播机制)】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、ndarray数组与标量的运算:加减乘除
import numpy as npar = np.arange(6).reshape(2, 3)
print('ar = ', ar)# 数组与标量的简单运算
print('ar + 10 = ', ar + 10) # 加法
print('ar * 2 = ', ar * 2) # 乘法
print('1 / (ar + 1) = ', 1 / (ar + 1)) # 除法
print('ar ** 0.5 = ', ar ** 0.5) # 幂
print('-' * 100)
打印结果:
ar = [[0 1 2][3 4 5]]
ar + 10 = [[10 11 12][13 14 15]]
ar * 2 = [[ 0 2 4][ 6 8 10]]
1 / (ar + 1) = [[1. 0.5 0.33333333][0.25 0.2 0.16666667]]
ar ** 0.5 = [[0. 1. 1.41421356][1.73205081 2. 2.23606798]]
二、ndarray数组与数组的运算(广播机制)
- 数组与数之间的运算
- 数组与数组之间的运算
- 数组间运算的广播机制
arr1 = np.array([[1, 2, 3, 2, 1, 4], [5, 6, 1, 2, 3, 1]])
arr2 = np.array([[1, 2, 3, 4], [3, 4, 5, 6]])
上面这个能进行运算吗,结果是不行的!
数组运算,满足广播机制,就OK:
- 维度相等
- shape(其中对应的地方为1,也是可以的)
数组在进行矢量化运算时,要求数组的形状是相等的。当形状不相等的数组执行算术运算的时候,就会出现广播机制,该机制会对数组进行扩展,使数组的shape属性值一样,这样,就可以进行矢量化运算了。下面通过一个例子进行说明:
arr1 = np.array([[0],[1],[2],[3]])
arr1.shape
# (4, 1)arr2 = np.array([1,2,3])
arr2.shape
# (3,)arr1+arr2
# 结果是:
array([[1, 2, 3],[2, 3, 4],[3, 4, 5],[4, 5, 6]])
上述代码中,数组arr1是4行1列,arr2是1行3列。这两个数组要进行相加,按照广播机制会对数组arr1和arr2都进行扩展,使得数组arr1和arr2都变成4行3列。
下面通过一张图来描述广播机制扩展数组的过程:
这句话乃是理解广播的核心。广播主要发生在两种情况,一种是两个数组的维数不相等,但是它们的后缘维度的轴长相符,另外一种是有一方的长度为1。
广播机制实现了时两个或两个以上数组的运算,即使这些数组的shape不是完全相同的,只需要满足如下任意一个条件即可。
- 如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符,
或
- 如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度其中的一方的长度为1。
广播会在缺失和(或)长度为1的维度上进行。
广播机制需要扩展维度小的数组,使得它与维度最大的数组的shape值相同,以便使用元素级函数或者运算符进行运算。
如果是下面这样,则不匹配:
A (1d array): 10
B (1d array): 12
A (2d array): 2 x 1
B (3d array): 3 x 4 x 3
思考:下面两个ndarray是否能够进行运算?
arr1 = np.array([[1, 2, 3, 2, 1, 4], [5, 6, 1, 2, 3, 1]])
arr2 = np.array([[1], [3]])
arr1 = np.array([[1],[2]])
arr2 = np.array([[[2,1,5],[2,1,5]],[[4,5,6],[4,5,6]],[[7,8,9],[7,8,9]]])
arr1 = np.array([[1],[2]])
arr2 = np.array([[[2,1,5],[2,1,5],[2,1,5]],[[4,5,6],[4,5,6],[4,5,6]],[[7,8,9],[7,8,9],[7,8,9]]])
这篇关于NumPy(四):数学运算【数组与标量的运算:加减乘除】【数组与数组的运算(广播机制)】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!