文章导读
- 课程难度:★★☆☆☆
- 重要度:★★★☆☆
- 预计学习时间:1小时
- 简介:本节主要讲解了python数据分析中数据运算的部分,包括:(1)基于基础一、二元的各种运算、三角函数的创建与运算、指对数的各种运算、调整精度的方法以及求向量和、差分及乘积等运算;(2)列表、numpy数组、Series和Dataframe数据的排序与查找问题。
- 重点涉及的函数和内容:np.round()、.sort()、sorted()、.argsort()、.sort_values()、.sort_index()、np.where()。
关于数学运算集中在numpy和scipy,而数据分析应用则主要集中在pandas。因此,我们在数据分析方面以DataFrame为素材讲解,在数学运算方面主要以numpy 数组为素材讲解,但有一些内置库的相似方法我们也会涉及。
我们首先将如下函数库引入:
import numpy as np
import pandas as pd
import scipy
一、算术运算
我们一般用numpy实现数学运算领域的各种功能,因此在这里主要围绕numpy进行讲解。当然,有许多函数名称、调用方法和返回结果相同的函数,也存在于内置方法库和pandas中,我们这里也会进行一一地讲解。
首先提一下我们常使用的一些科学常数。这里包括自然对数的底数e
、欧拉常数γ
(调和级数和自然对数差值的极限)、以及π
。其余的np.nan
、np.inf
等在之前讲解过:
np.e
np.euler_gamma
np.pi
我们首先建立部分将在后续经常用于展示运算效果的数据:
x = np.array([100.45, 100.02, 100.0, 99.97, 100.05])
x1 = np.array([104.15, 98.72, 100.0, 102.25, 99.65])
y = np.array([1.639, 0.578, 1.031, 1.031, 0.59])
z = np.array([-4.5, -3, 2.5, 0.76, -0.5])
w = np.array([np.inf, np.nan, float('nan'), 1e10, 500])
x_int = np.array([13, 25, 24, 16, 33])
y_int = np.array([7, 5, 15, 20, 22])
x_bit = np.array([0b0101, 0b0110, 0b0101, 0b1010, 0b1101])
y_mv = np.array([1, 1, 1, 1, 1])
y_bit = np.array([0b0011, 0b1010, 0b0101, 0b1101, 0b0111])
x_bool = np.array([True, False, True, True, False])
y_bool = np.array([False, False, True, False, True])
x_array = np.array([[1, 2],[3, 4],[5, 6]]) # 3 * 2矩阵
y_array = np.array([[1, 2, 3, 4],[5, 6, 7, 8]]) # 2 * 4矩阵
1、基础一元及二元运算
我们首先介绍我们最为基础的一些运算,包括我们的加减乘除等等。这些运算可以分成几类,例如分成一元或二元运算、分成算数计算、逻辑计算,算数计算其中还有位运算等等。
常用的算术运算符包括:
+,-,*,/,** # 加、减、乘、除、乘方
//,% # 整数除法、整数除法的余数
&,|,~,^ # 与、或、非、亦或运算
<<,>> # 位运算
@ # 矩阵乘法
常用的比较运算符包括:
<,<= # 小于、小于等于
>,>= # 大于、大于等于
==,!= # 等于、不等于
(1)一元算术运算
一元运算符首先包括+
、-
和~
,分别表示正、负和按位取反:
+ x # np.positive(x)
- x # np.negative(x)
~x # np.invert(x_bit)
~x_bool # np.invert(x_bool)
执行上述代码,各自的运算结果如下:
[100.45 100.02 100. 99.97 100.05]
[-100.45 -100.02 -100. -99.97 -100.05]
[ -6 -7 -6 -11 -14]
[False True False False True]
其余一元运算函数包括:
np.modf(x) # 原值的整数和小数部分,形式为以两个ndarray数组组成的元组
np.fabs(x) # 原值的绝对值,另有np.absolute(x)
np.reciprocal(x) # 原值的倒数
np.sqrt(x) # 原值的平方根 square root,等同于x ** (1/2)
np.cbrt(x) # 原值的立方根 cube root,等同于x ** (1/3)
np.square(x) # 原值的平方,等同于x ** (2)
(2)二元算术运算
可以通过运算符完成的包括+
、-
、*
、/
、//
、%
和**
,这些运算符实现的运算含义和前面所描述的一致:
x + y # np.add(x, y)
x - y # np.subtract(x, y)
x * y # np.multiply(x, y)
x / y # np.divide(x, y), 另有np.true_divide(x, y)
x // y # np.floor_divide(x, y)
x % y # np.mod(x, y), 另有np.fmod(x, y)、np.remainder(x, y)
x ** y # np.power(x, y), 另有np.float_power(x, y)
x_array @ y_array # np.dot(x_array, y_array)
各自的运算结果如下:
[102.089 100.598 101.031 101.001 100.64 ]
[98.811 99.442 98.969 98.939 99.46 ]
[164.63755 57.81156 103.1 103.06907 59.0295 ]
[ 61.28737035 173.0449827 96.99321048 96.96411251 169.57627119]
[ 61. 173. 96. 96. 169.]
[0.471 0.026 1.024 0.994 0.34 ]
[1910.71517777 14.32353453 115.34532578 115.30964964 15.14007703]
[[11 14 17 20]
[23 30 37 44]
[35 46 57 68]]
其余二元算数函数包括:
np.divmod(x, y) # 同时返回相除的整数部分和余数,形式为以两个
# ndarray数组组成的元组,等于floor_divide和mod的合并
np.gcd(x_int, y_int) # 最大公约数,greatset common divisor
np.lcm(x_int, y_int) # 最小公倍数,lowest common multiple
np.maximum(x, x1) # 两个数组中对应元素的较大值,另有np.fmax(x, x1)
np.minimum(x, x1) # 两个数组中对应元素的较小值,另有np.fmin(x, x1)
各自的运算结果如下:
array([ 61., 173., 96., 96., 169.]), array([0.471, 0.026, 1.024, 0.994, 0.34 ]))
[ 1 5 3 4 11]
[ 91 25 120 80 66]
[104.15 100.02 100. 102.25 100.05]
[100.45 98.72 100. 99.97 99.65]
(3)二元逻辑运算
首先是**布尔运算中的逻辑运算符&
、|
、~
、^
:在这里插入代码片
x_bool & y_bool # np.logical_and(x_bool, y_bool)
x_bool | y_bool # np.logical_or(x_bool, y_bool)
~x_bool # np.logical_not(x_bool)
x_bool ^ y_bool # np.logical_xor(x_bool, y_bool)
各自的运算结果如下:
[False False True False False]
[ True False True True True]
[False True False False True]
[ True False False True True]
接下来是二进制位的逻辑运算符&
、|
、~
、^
,这些符号同样适用于二进制位。为便于展示,这里用二进制形式展示各二进制值:
[format(intvalue, '#b') for intvalue in (x_bit & y_bit)] # np.bitwise_and(x_bit, y_bit)
# 位运算的与运算
[format(intvalue, '#b') for intvalue in (x_bit | y_bit)] # np.bitwise_or(x_bit, y_bit)
# 位运算的或运算
[format(intvalue, '#b') for intvalue in (~x_bit)] # np.invert(x_bit)
# 位运算的非运算
# 原码为补码取反后加1
[format(intvalue, '#b') for intvalue in (x_bit ^ y_bit)] # np.bitwise_xor(x_bit, y_bit)
# 位运算的异或运算
各自的运算结果如下:<