数据分析包Numpy-Pandas-Matplotlib
Numpy
Numpy是什么?
Numpy是一个数值计算基础库,能提供高性能的多维数组对象(ndarray).
# 安装命令pip install numpy基本语法
创建一个ndarray有很多种方法,以下为示例
import numpy as np
if __name__ == '__main__': # 将列表转换为numpy数组,np可自动推断数据类型 # array(<列表>[,dtype=<类型>]) # 该方法将原列表复制一份存放在np特有的格式中. # 若要创建视图(非复制),需要使用asarray方法.使用方法同该方法. # 注意: # 不建议使用混合类型的列表去创建numpy数组,会降低性能. # array方法默认为复制原列表,asarray方法默认为创建视图(引用原列表).
# 创建ndarray的方式有很多种 # 方式一: 将列表转换为ndarray. a1 = np.array([1, 2, 3, 4, 5]) # 一维列表 a2 = np.array([[1, 2, 3], [1, 2, 3], [1, 2, 3]]) # 二维列表
# 方式二: 创建全0的ndarray,默认类型为浮点数. # zeros((<形状描述元组>)[,dtype=<类型>]) z1 = np.zeros(2, dtype=np.int8) z2 = np.zeros((2, 3), dtype=np.int8)
# 方式三: 创建全1数组,默认类型为浮点数. o1 = np.ones(2, dtype=np.int8) o2 = np.ones((3, 4), dtype=np.int8)
# 方式四: 创建空数组,这里面的值是垃圾值. # 值没有意义,只当确定会对数组内的内容进行全部覆盖时才会用. # 性能比zeros和ones高一些. ep1 = np.empty(2, dtype=np.int8)
# 方式五: 创建序列数组. # arange(<起始值>,<终止值>,<步长>),左闭右开 ar1 = np.arange(1, 10, 2)
# 方式六: 创建等差序列数组. # linspace(<起始值>,<终止值>,<元素数量>,endpoint=<是否包含终止值>),默认左闭右闭,创建一个等差数列. # endpoint=True: 不包含终止值,即将终止值也计算为一个元素,但不会返回. # 如 1,10,4,endpoint=True与1,10,5,endpoint=False的区别只差在有没有最后一个元素. ls1 = np.linspace(1, 10, 5, endpoint=True)
# 方式七: 创建随机数组 # 随机数组有三种,均匀数组,标准正态分布数组,指定范围的随机数组. # 均匀数组 ra1 = np.random.rand(2, 3)
# 标准正态分布数组 ra2 = np.random.randn(2, 3)
# 指定范围的随机数组,默认左闭右开 # randint(<最小值>,<最大值>,<元素数量>) ra3 = np.random.randint(1, 10, (3, 4))常用属性
ndim: 获取维度维度数.
shape: 获取形状.
size: 元素数量.
dtype: 元素类型,若类型不一致,则为object.
import numpy as np
if __name__ == '__main__': list_array = np.array([[1, 2, 3], [1, 2, 3], [1, 2, 3]]) print(list_array.ndim) # 维度数 print(list_array.shape) # 形状 print(list_array.size) # 元素数量 print(list_array.dtype) # 元素类型,若类型不一致,则为object.形状管理
形状是什么呢? 在返回的结果中,形状是一个元组,如(1,2),这代表了一个二维数组,其有1行2列.
reshape(<形状描述>): 修改数组的形状.
- 元素数量不变,reshape返回的是一个视图,对视图的修改会影响到原来的数组.
- 对于缺失一个维度大小的数组,可以使用-1进行自动计算. -1只能出现一次.
import numpy as np
if __name__ == '__main__': ar1 = np.arange(1, 65, 1)
# 使用reshape方法修改数组的形状 # 注意: 元素数量不变,reshape方法返回的是一个视图,修改原数组的值也会影响到新数组. # 如果能确定行或列的个数,另外一个参数可以动态计算,使用-1动态计算.只能出现1个. ar2 = ar1.reshape(2, 4, 8)
# 转置,转置时,使用的是引用,修改转置数组会影响原数组. # 二维时,(行,列) -> (列,行) # 三维时,(层,行,列) -> (列,行,层) # 更高维时,也是将维度顺序反转. ar3 = ar2.TT: 转置. 将数组的所有维度反转.
- 二维时,(行,列) -> (列,行)
- 三维时,(层,行,列) -> (列,行,层)
- 高维同理.
运算
数组支持所有标准数学运算.但要求数组大小满足以下条件才可以执行运算(三个条件满足其中一个即可 or).
- 维度大小相等.
- 其中一个维度的大小为一.
- 其中一个数组没有该维度,视为1.
import numpy as np
if __name__ == '__main__': a1 = np.array([4, 2, 4]) a2 = np.array([2, 1, 2]) try: # 使用方法与使用运算符的行为一致 # 数学运算 print(f"{a1} + \n{a2} = \n{a1 + a2}\n") print(f"{a1} - \n{a2} = \n{a1 - a2}\n") print(f"{a1} * \n{a2} = \n{a1 * a2}\n") print(f"{a1} / \n{a2} = \n{a1 / a2}\n") print(f"{a1} ** \n{a2} = \n{a1 ** a2}\n")
print(f"{a1} + \n{a2} = \n{np.add(a1, a2)}\n") print(f"{a1} - \n{a2} = \n{np.subtract(a1, a2)}\n") print(f"{a1} * \n{a2} = \n{np.multiply(a1, a2)}\n") print(f"{a1} / \n{a2} = \n{np.divide(a1, a2)}\n") print(f"{a1} ** \n{a2} = \n{np.power(a1, a2)}\n") # 逻辑运算 print(f"{a1} == \n{a2} = \n{a1 == a2}\n") print(f"{a1} != \n{a2} = \n{a1 != a2}\n") print(f"{a1} > \n{a2} = \n{a1 > a2}\n") print(f"{a1} < \n{a2} = \n{a1 < a2}\n") print(f"{a1} >= \n{a2} = \n{a1 >= a2}\n") print(f"{a1} <= \n{a2} = \n{a1 <= a2}\n") except Exception as e: print(e) # (2,4)形状的数组 a3 = np.array([ [1, 2, 3, 4], [5, 6, 7, 8] ]) # (4,3)形状的数组 a4 = np.array([ [1, 2, 5], [3, 4, 5], [5, 6, 5], [7, 8, 5] ]) # matmul(<数组1>,<数组2>): 用于计算两个数组的矩阵乘法 # 注意: 数组1的列数必须与数组2的行数相等. # 在本例中,数组1的列为4列,数组2的行为4行,相等,可以执行计算. # 结果集大小: (数组1的行数,数组2的列数) print(f"{a3} * \n{a4} = \n{np.matmul(a3, a4)}\n")广播机制
是什么? 当Numpy需要计算两个形状不同的数组时,会在不复制数据的前提下,“虚拟扩展”较小的数组,使其形状与较大数组形状兼容,避免显式复制和循环.
规则1: 维度数不同时,给维度较少的数组,在左侧补1.
-
Numpy在计算数组时会先进行对齐,对齐是从右到左进行对齐的.缺失的维度视为1且只会补齐左侧的维度,右侧的维度是不会被补齐的.
如A.shape: (3,) 与 B.shape: (2,3), 运算时,会这样处理
- 检查维度缺失: 发现A缺少维度,从右到左运算,将A补齐缺失维度: (1,3)
- 检查是否可广播: A进行广播(匹配规则3): (2,3)
规则2: 某一维度的长度要么相等,要么其中一个为1.
- 若两个数组在同一维度上长度不相等,也没有一个是1,则无法广播.
规则3: 长度为1的维度在运算时可被广播
-
若两个数组在同一维度上长度不相等,维度为1,则维度为1的维度,会被广播.
如A.shape: (2,2,3,4) 与 B.shape: (1,2,3,4),运算时,会这样处理
- 检查维度缺失: 未发现维度缺失
- 检查是否可广播: 发现B在第一维度为1,所以将B进行广播 B.shape: (2,2,3,4)
规则4: 输出形状取各维度上的最大值
-
运算结果的每一维度的大小,等于参与运算数组在该维度上的最大长度
如A.shape: (8,1,6,1)与B.shape: (7,1,5)运算时,会这样处理
- 检查维度缺失: 发现B缺失维度,从右到左运算,将B补齐缺失维度: (1,7,1,5)
- 检查是否可广播: 发现A与B在每一维度都对应不上,但对应的维度上都为1,所以将A与B同时进行广播 A.shape: (8,7,6,5),B.shape: (8,7,6,5)
但总结下来,实际上就两步
- 检查维度缺失,进行补齐
- 检查是否可广播,进行拉伸
Pandas
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!






















