NumPy(四):数学运算【数组与标量的运算:加减乘除】【数组与数组的运算(广播机制)】

一、ndarray数组与标量的运算:加减乘除

import numpy as np

ar = 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:

  1. 维度相等
  2. 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

NumPy(四):数学运算【数组与标量的运算:加减乘除】【数组与数组的运算(广播机制)】_第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,NumPy,多维数组)