在前面的课程中我们提到过使用NumPy能够非常便捷的进行一些运算,从本节课开始我们将会逐渐的对这些运算进行深入的学习。
在以前,我们如果要对两个同形状的数组进行对应位置的四则运算时,我们必须要对两个数组进行循环处理,代码量上来说并不少,并且容易出错。
有了NumPy之后,这些运算将会变的非常的简单。
四则运算
先回顾下Python中有哪些算数运算符吧。
老规矩,先上一段代码,然后再对着代码进行讲解。
import numpy as np
arr1=np.array([11,12,13])
arr2=np.array([21,22,23])
arr3=np.array([31,32,33])
#Numpy四则运算有两种方法
#第一种就是使用数学操作符号
print(arr1+arr2)
print(arr1+arr2+arr3)
print(arr1-arr2)
print(arr1-arr2-arr3)
print(arr1*arr2)
print(arr1/arr2)
#第二种就是使用以下方法
print(np.add(arr1,arr2))
print(np.add(np.add(arr1,arr2),arr3))
print(np.subtract(arr1,arr2))
print(np.multiply(arr1,arr2))
print(np.divide(arr1,arr2))
结果为:
[32 34 36]
[63 66 69]
[-10 -10 -10]
[-41 -42 -43]
[231 264 299]
[0.52380952 0.54545455 0.56521739]
[32 34 36]
[63 66 69]
[-10 -10 -10]
[231 264 299]
[0.52380952 0.54545455 0.56521739]
除了四则运算,在学习Python基础时,所学习的取余数、整除、幂运算等都是支持的。
对应的运算符号就是%、//、**。可以自己试试哦。
下面我们要学习的知识点叫做比较运算
回顾下Python中有哪些比较运算符吧。
比较运算
我们依然是从代码中理解这些运算吧。
import numpy as np
arr1=np.array([11,12,13])
arr2=np.array([21,22,23])
#Numpy比较运算有两种方法
#第一种就是使用数学操作符号
print(arr1>arr2)
print(arr1>=arr2)
print(arr1
print(arr1<=arr2)
print(arr1==arr2)
print(arr1!=arr2)
#第二种就是使用以下方法
print(np.greater(arr1,arr2))
print(np.greater_equal(arr1,arr2))
print(np.less(arr1,arr2))
print(np.equal(arr1,arr2))
print(np.not_equal(arr1,arr2))
结果为:
[False False False]
[False False False]
[ True True True]
[ True True True]
[False False False]
[ True True True]
[False False False]
[False False False]
[ True True True]
[False False False]
[ True True True]
从结果上看,运用比较运算符可以返回布尔类型的值,也就是True和False。
那我们什么时候会用到这样的运算呢?
第一种情况是从数组中查询满足条件的元素,第二种情况是根据判断的结果执行不同的操作。我们还是用代码来看一下具体是怎么一回事吧
import numpy as np
arr1=np.array([23,12,25])
arr2=np.array([21,15,23])
print(arr1[arr1>arr2])
print(arr1[arr1>24])
print(np.where(arr1>24,0,arr1))
print(np.where(arr2>16,1,0))
结果为:
[23 25]
[25]
[23 12 0]
[1 0 1]
广播运算
你有可能注意到了一个细节,上面我们所有的运算都是基于相同形状的数组,那么当数组形状不同时,能够让它们之间进行运算吗
答案肯定是可以的啦,这种情况我们把它叫做广播运算。
以上代码的结果为:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[101 102 103 104]
[105 106 107 108]
[109 110 111 112]]
这里由于维度一致,所以没有用到广播运算:
[[101 103 105 107]
[109 111 113 115]
[117 119 121 123]]
============================================================
我是arr1:[[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
[[12 13 14]
[15 16 17]
[18 19 20]
[21 22 23]]
[[24 25 26]
[27 28 29]
[30 31 32]
[33 34 35]]
[[36 37 38]
[39 40 41]
[42 43 44]
[45 46 47]]
[[48 49 50]
[51 52 53]
[54 55 56]
[57 58 59]]]
我是arr2:[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
维数不一致,但是末尾的维度值是一致的:
[[[ 0 2 4]
[ 6 8 10]
[12 14 16]
[18 20 22]]
[[12 14 16]
[18 20 22]
[24 26 28]
[30 32 34]]
[[24 26 28]
[30 32 34]
[36 38 40]
[42 44 46]]
[[36 38 40]
[42 44 46]
[48 50 52]
[54 56 58]]
[[48 50 52]
[54 56 58]
[60 62 64]
[66 68 70]]]
============================================================
我是arr1:[[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
[[12 13 14]
[15 16 17]
[18 19 20]
[21 22 23]]
[[24 25 26]
[27 28 29]
[30 31 32]
[33 34 35]]
[[36 37 38]
[39 40 41]
[42 43 44]
[45 46 47]]
[[48 49 50]
[51 52 53]
[54 55 56]
[57 58 59]]]
我是arr2:[[0]
[1]
[2]
[3]]
维数不一致,维度值也不一致的,但维度值至少有一个为1:
[[[ 0 1 2]
[ 4 5 6]
[ 8 9 10]
[12 13 14]]
[[12 13 14]
[16 17 18]
[20 21 22]
[24 25 26]]
[[24 25 26]
[28 29 30]
[32 33 34]
[36 37 38]]
[[36 37 38]
[40 41 42]
[44 45 46]
[48 49 50]]
[[48 49 50]
[52 53 54]
[56 57 58]
[60 61 62]]]
============================================================
我是arr1:[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
我是arr2:[1 2 3]
arr2会自动补齐成为1行3列的数组进行运算:
[[ 1 3 5]
[ 4 6 8]
[ 7 9 11]
[10 12 14]]
no=no=no=no=no=no=no=no=no=no=no=no=no=no=no=no=no=no=no=no=no=no=no=no=no=no=no=no=no=no=
我是arr1:[[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
[[12 13 14]
[15 16 17]
[18 19 20]
[21 22 23]]
[[24 25 26]
[27 28 29]
[30 31 32]
[33 34 35]]
[[36 37 38]
[39 40 41]
[42 43 44]
[45 46 47]]
[[48 49 50]
[51 52 53]
[54 55 56]
[57 58 59]]]
我是arr2:[[0 1]
[2 3]
[4 5]
[6 7]]
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
in
34 print("我是arr1:{}".format(arr1))
35 print("我是arr2:{}".format(arr2))
---> 36 print("不能做运算:\n{}".format(arr1+arr2))
ValueError: operands could not be broadcast together with shapes (5,4,3) (4,2)
补充:在数学中,矩阵的维数就是矩阵的秩,矩阵的秩就是矩阵中非零子式的最高阶数。简单来说,就是把矩阵进行初等行变换之后有非零数的行数。
维数是对形状的描述,红框是维数是3,绿框维数是2,红框第一维的维度值是5,第二维的维度值是4以此类推。