numpy 学习汇总18.2 - 数学运算( 基础学习 tcy)
发布日期:2021-06-29 14:47:50 浏览次数:3 分类:技术文章

本文共 6001 字,大约阅读时间需要 20 分钟。

数学运算 2018/6/18 2018/11/29
1.算术运算 # +, - ,*,/,//,%,divmod(),** or pow()
# 1)运算符a=np.arange(1,7).reshape(2,3);b=2a+b==np.add(a,b)a-b==np.subtract(a,b)a*b==np.multiply(a,b)a/b==np.divide(a,b) #array([[True,True,True],[True,True,True]])a/b #除法 #array([[0.5,1.,1.5],[2.,2.5, 3. ]])a//2 #取整除法a ** 2 #幂运算a % 2 #取余 #array([[1, 0, 1],[0, 1, 0]], dtype=int32)A.dot(B) #矩阵乘法# 2)通用函数ufunc:#倒数np.reciprocal(1/4)==4/1 #Truenp.log(np.arange(3)) # array([-inf, 0., 0.69314718])np.sqrt(np.arange(3)) # array([0., 1.,1.41421356])x = np.array([ 1, 2, 3])y = np.array([ 4, 5, 6])np.maximum(x, y) # array([4, 5, 6])# 返回浮点数的整数和小数x = np.array([ 3.2, 5.4,-2.8])np.modf(x) #(array([ 0.2, 0.4, -0.8]), array([ 3., 5., -2.])) #三角函数a = np.array([0,30,45,60,90])sin = np.sin(a*np.pi/180)#array([0.,0.5,0.70710678,0.8660254 ,1.])inv = np.arcsin(sin)np.around(inv,1) #array([0. , 0.5, 0.8, 1. , 1.6])np.degrees(inv) #array([ 0., 30., 45., 60., 90.])注意:1)单值计算采用math库函数,多值ndarray计算采用numpy中函数;a,b可为数组标量2)如算式复杂且数组很大,会产生大量中间结果降低程序效率如x=a*b+c相当于:t = a * b;x = t + c;del t# 修改:x = a*b ;x += c #减少一次内存分配 
2.整数位运算 
No 函数 说明 符号1 bitwise_and 对数组元素执行位与操作 &2 bitwise_or 对数组元素执行位或操作 |3 bitwise_xor 异或运算 ^4 invert 按位取反 ~5 left_shift 向左移动二进制表示的位 <<6 right_shift 向右移动二进制表示的位 >>bin(13) # str '0b1101'bin(~13) # str '-0b1110'a=np.invert(np.array([13], dtype = np.uint8))# array([242], dtype=uint8)np.binary_repr(~13,width=8) #整数位非 #'11110010'np.binary_repr(a.item(),width=8) # '11110010'a=~np.arange(5, dtype=np.uint8) #位取反# array([255, 254, 253, 252, 251], dtype=uint8)[hex(i) for i in a] # ['0xff', '0xfe', '0xfd', '0xfc', '0xfb']np.binary_repr(10, width = 8) #'00001010'np.binary_repr(10<<2, width = 8)#左移位 #'00101000'np.binary_repr(np.left_shift(10,2), width = 8) #'00101000'a = np.array([0b1010, 0b0100, 0b1100, 0b1001])b = np.array([0b1110, 0b1100, 0b1110, 0b0101])[bin(i) for i in a] # ['0b1010', '0b100', '0b1100', '0b1001'][bin(i) for i in b] # ['0b1110', '0b1100', '0b1110', '0b101'][bin(i) for i in a & b] # ['0b1010', '0b100', '0b1100', '0b1'][bin(i) for i in np.bitwise_or(a, b)] # ['0b1110', '0b1100', '0b1110', '0b1101']  

 3.比较逻辑运算: 

1.逻辑运算a = np.array([1, 1, 0, 0], dtype=bool)b = np.array([4, 0, 2.5, 0])np.logical_or(a, b) # array([ True, True, True, False], dtype=bool)np.logical_and(a, b) # array([ True, False, False, False], dtype=bool)2.元素比较 # 返回bool数组 运算符(==, <,>,<=,> =,!=)a = np.arange(5) # array([0, 1, 2, 3, 4])b = np.arange(4,-1,-1) # array([4, 3, 2, 1, 0])# 1).元素比较:a == b # array([False, False, True, False, False])a >= b # array([False, False, True, True, True])np.logical_and(a>=2,b<2) # array([False, False, False, True, True])(a>=2) & (b<2) # array([False, False, False, True, True])np.logical_or(a>=2,b<2) # array([False, False, True, True, True])(a>=2) | (b<2) # array([False, False, True, True, True])# 2).数组比较:不能用and、or和not(用于标量)a==b and a>b # 抛出ValueError异常np.array_equal([1, 2], [1, 2])# True 数组相等判断np.array_equiv([1, 2], [1, 2])# True 数组等价判断# all检查数组中所有值都是True,也能用于非布尔型数组np.all(b) # Falsenp.all(a==b) # False ((a <= b) & (b != 5)).all() # False# any测试数组中至少存在一个非0元素=Trueb.any() # Truenp.any((a <= b) & (b != 5)) # Truenp.any([True, True, False]) # Truenp.any(a==b) and np.any(a>b) # True # 3).布尔型数组: # 统计Ture值数量(a < b).sum() # 在运算中bool值被强制转换为1 (True) 和0(False)

4.其他: 

# 1.转置:a = np.triu(np.ones((3, 3)), 1) # array([[ 0., 1., 1.], [ 0., 0., 1.],[ 0., 0., 0.]])a.T # array([[ 0., 0., 0.], [ 1., 0., 0.], [ 1., 1., 0.]])'# 2.广播a = np.arange(0, 40, 10)a.shape # (4,)a = a[:, np.newaxis] # adds a new axis -> 2D arraya.shape # (4, 1)a # array([[ 0],[10],[20],[30]])a + b # array([[ 0, 1, 2],[10, 11, 12], [20, 21, 22],[30, 31, 32]]) 
5.应用:利用数组进行数据处理 
1).说明:# 1)NumPy数组使你可以将许多种数据处理任务表述为简洁的数组表达式(否则需编写循环)# 2)用数组表达式代替循环的做法通常被称为矢量化。# 3)一般来说,矢量化数组运算要比等价的纯Python方式快上一两个数量级。# 4)不同大小的数组之闹的运算叫做广播;广播一种专们对矢量化计算的强大手段。2).计算sqrt(x^2 + y^2 )x = np.arange(1, 4) # array([1, 2, 3])x1, x2 = np.meshgrid(x, x+10) # [x,x+5]x1 # array([[1, 2, 3],[1, 2, 3],[1, 2, 3]])x2 # array([[11, 11, 11],[12, 12, 12],[13, 13, 13]])z = np.sqrt(x1 * 10+1 + x2 * 2-8)np.around(z,decimals=1) # array([[5.,5.9,6.7],[5.2,6.1,6.9], [5.4, 6.2, 7. ]]) 
3).将条件逻辑表述为数组:
# np.where 是表达式x if condition else y的矢量化版本# 示例1:根据条件选取x和y的值:x = np.array([1.1, 1.2, 1.3, 1.4, 1.5])y = np.array([2.1, 2.2, 2.3, 2.4, 2.5])cond = np.array( [True, False, True, True, False])# 1).列表推导式实现:result= [ ( x1 if c1 else y1 ) for x1, y1, c1 in zip(x, y, cond)]# 结果同下# 大数组处理速度不快;不能用多维数组。# 2)使用np.where :result = np.where(cond, x, y) # [1.1, 2.2, 1.3, 1.4, 2.5]# 示例2: 随机数当数据为正时设为2,为负时设为-2arr= np.random.randn(4, 4)np.where(arr>0,2, np.where(arr<0,-2,arr) )  
4). for循环改写成嵌套where表达式: 
# 示例1:根据bool数组cond1和cond2组合实现不同的赋值result = [ ]cond1=np.array([True,False])cond2=np.array([False,True])#1)for 语句for i in range(2):if cond1[i] and cond2[i]:result.append(0)elif cond1[i]:result . append(1)elif cond2[i]:result.append(2)else:result.append(3)result#[1, 2]#2)where 语句-传递给where数组大小可相等,可是标量值np.where(cond1 & cond2,0,np.where(cond1,1,np.where(cond2,2,3)))# array([1, 2])===================================================================== =========== 
  函数 说明
  abs, fabs 整数, 浮点数或复数绝对值 。非复数值fabs更快
  sqrt 计算各元素平方根 。ar r ** 0.5
  squa re 计算各元素平方。arr ** 2
  exp 计算各元素指数e^x
  log, log10, log2, lg1p 自然对数 (e ), 对数 (底数e,10,21+x )
  sign  各元素的正负号 :1 ( 正数), 0 ( 零) , ( 负数) 
  ceil 计算各元素ceiling值 ,即大于等于该值的最小整数
  floor 计算各元素floor值 ,即小于等于该值的最大整数  
  rint 将各元素值四舍五入到最接近的整数 ,保留dtype 
  modf  将数组小数和整数部分以两个独立数组的形式返回
  isnan 返回一个表示哪些值是NaN(不是数字) 的布尔型数组
  isfinite 返 回一个表示哪些元素是有穷  (非inf ,非NaN )的布尔型数组 
  isinf 返 回一个表示哪些元素是无穷的布尔型数组 
  cos ,cosh ,sin, sinh,tan,tanh 普通型和双曲型三角函数
  arccos, a rccosh, aresin, 反三角函数
  arcsinh, arctan, arctanh   反三角函数
  logical_ not                         计算各元素not x的真值。相当于- arr
  二元ufunc函数  
  add 数组中对应元素相加
  subtract  数组中对应元素相减
  multiply 数组元素相乘
  divide 除法
  floor_divide 向下取整除法 (丢弃余数)
  power a^b
  maximum,fmax 元素级最大值计算。fmax将忽略NaN 
  minimum,fmin 元素级最小值计算 。fmin将忽略NaN
  mod 元素级求模计算 ( 除法的余数)
  copysign 将第二个数组中值符号复制给第一个数组中的值
  greater,greater_equal, less, 执行元素级的比较运算 最终产生布尔型数组。
  less_equal, equal,not  equal >,>=,<,<=,==,!=
  logical_and,logical_or,logical_xor 执行元素级真值逻辑运算。相当于&| ^

 

转载地址:https://chunyou.blog.csdn.net/article/details/84642574 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:numpy 学习汇总18.2 - 字符char操作( 基础学习 tcy)
下一篇:numpy 学习汇总18.1 - 统计函数( 基础学习 tcy)

发表评论

最新留言

很好
[***.229.124.182]2024年04月09日 06时41分11秒