Numpy模块中可以实现数组的基本运算。
#加法运算
math = np.array([12,34,23,56,78,34])
english = np.array([56,67,23,45,12,67])
chinese = np.array([1,2,4,5,23,12])
sum_result1 = math + english + chinese
sum_result2 = np.add(np.add(math,english),chinese)
print('符号加法:',sum_result1)
print('函数加法:',sum_result2)
#除法运算
height = np.array([165,176,167,189,165])
weight = np.array([78,67,45,76,56])
BMI_symbol = weight / (height / 100) ** 2
BMI_fun = np.divide(weight,np.divide(height,100) ** 2)
print('符号除法:',BMI_symbol)
print('函数除法:',BMI_fun)
OUT:
符号加法: [ 69 103 50 106 113 113]
函数加法: [ 69 103 50 106 113 113]
符号除法: [28.65013774 21.62964876 16.13539388 21.27600011 20.56932966]
函数除法: [28.65013774 21.62964876 16.13539388 21.27600011 20.56932966]
四则运算中的符号分别为:”±*/“,对应的函数分别是np.add,np.subtract,np.multiply,np.divide。这些函数只能接受两个对象的运算,需要进行多个对象的计算需要进行嵌套。除了基本的四则运算,还提供以下的计算。
arr7 = np.array([[1,2,10],[10,7,9],[7,3,5]])
arr8 = np.array([[2,2,2],[3,3,3],[4,4,4]])
print('数组arr7:\n',arr7)
print('数组arr8:\n',arr8)
#求余数
print('计算余数:\n',arr7 % arr8)
#求整除
print('计算整除:\n',arr7 // arr8)
#求指数
print('计算指数:\n',arr7 ** arr8)
OUT:
数组arr7:
[[ 1 2 10]
[10 7 9]
[ 7 3 5]]
数组arr8:
[[2 2 2]
[3 3 3]
[4 4 4]]
计算余数:
[[1 0 0]
[1 1 0]
[3 3 1]]
计算整除:
[[0 1 5]
[3 2 3]
[1 0 1]]
计算指数:
[[ 1 4 100]
[1000 343 729]
[2401 81 625]]
"%,//,**"分别指的是取余,整除,指数运算,所对应的函数分别是np.fmod,np.modf和np.power,但是整除的函数应用会复杂一些,需要写成np.modf(arr7/arr8)[1],因为modf函数可以返回数值的小数部分和整数部分,而整数部分就是要取的整数除。
比较运算
符号 | 函数 | 含义 |
---|---|---|
> | np.greater(arr1,arr2) | 判断arr1的元素是否大于arr2的元素 |
>= | np.greater_equal(arr1,arr2) | 判断arr1的元素是否大于等于arr2的元素 |
< | np.less(arr1,arr2) | 判断arr1的元素是否小于arr2的元素 |
<= | np.less_equal(arr1,arr2 | 判断arr1的元素是否小于等于arr2的元素 |
== | np.equal(arr1,arr2) | 判断arr1的元素是否等于arr2的元素 |
!= | np.not_equal | 判断arr1的元素是否不等于arr2的元素 |
#取子集
#从arr7中取出arr7大于arr8的所有元素
import numpy as np
arr7 = np.array([[1,2,10],[10,7,9],[7,3,5]])
arr8 = np.array([[2,2,2],[3,3,3],[4,4,4]])
print('满足条件的二维数组元素的获取:\n',arr7[arr7>arr8])
#从arr9中取出大于10的元素
arr9 = np.array([3,10,23,7,34,5,3,6,8,34,89,9,0])
print('满足条件的一维数组元素的获取:\n',arr9[arr9>10])
#判断操作
#将arr7中取出大于7的元素改成5其余的不变
print('二维数组的条件操作:\n',np.where(arr7>7,5,arr7))
#将arr9中大于10的元素改为1,否则改为0
print('一维数组的条件操作:\n',np.where(arr9>10,1,0))
OUT:
满足条件的二维数组元素的获取:
[10 10 7 9 7 5]
满足条件的一维数组元素的获取:
[23 34 34 89]
二维数组的条件操作:
[[1 2 5]
[5 7 5]
[7 3 5]]
一维数组的条件操作:
[0 0 1 0 1 0 0 0 0 1 1 0 0]
广播运算
前面介绍的各种数学运算符都是针对相同形状的数组,当数组形状不同时,也能够进行数学运算的功能成为数组的广播。但是数组的广播功能也是有规则的,需要满足这些规则:
- 各输入数组的维度可以不相等,但是必须确保从右到左的对应维度相等。
- 如果对应维度值不相等,就必须保证其中一个为1。
- 各输入数组都向其shape最长的数组看齐,shape中不足的部分都通过在前面加1补充。
#各输入数组维度一致,对应维度值相等
import numpy as np
arr10 = np.arange(12).reshape(3,4)
arr11 = np.arange(101,113).reshape(3,4)
print('arr10:\n',arr10)
print('arr11:\n',arr11)
print('3*4的二维矩阵运算:\n',arr10+arr11)
OUT:
arr10:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
arr11:
[[101 102 103 104]
[105 106 107 108]
[109 110 111 112]]
3*4的二维矩阵运算:
[[101 103 105 107]
[109 111 113 115]
[117 119 121 123]]
#各输入数组维度不一样,对应维度值相等
arr12 = np.arange(60).reshape(5,4,3)
print('arr12:\n',arr12)
arr13 = np.arange(12).reshape(4,3)
print('arr13:\n',arr13)
print('维度不一致 但末尾的维度值一致:\n',arr12+arr13)
OUT:
arr12:
[[[ 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]]]
arr13:
[[ 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]]]
#各输入的数组维度不一致,对应的维度值不相等,但其中有一个为1
arr12 = np.arange(60).reshape(5,4,3)
arr13 = np.arange(4).reshape(4,1)
print('arr12:\n',arr12)
print('arr13:\n',arr13)
print('维数不一致,维度值也不一致,但维度值至少有一个为1:\n',arr12+arr13)
OUT:
arr12:
[[[ 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]]]
arr13:
[[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]]]