主要内容:
1 数据分析
a 概念: 是把隐藏在一些看似杂乱无章的数据背后信息提炼出来,总结出所研究对象的内在规律.
b 三剑客: Numpy Pandas Matplotlib
2 Numpy 是Python语言的一个扩展程序库, 支持大量的纬度数组与矩阵运算,此外也针对数组运算提供大量的数字函数库.
a ndarray的概念: ndarray 是一个多维的数组对象,具有矢量算术运算能力和复杂的广播能力,并具有执行速度快和节省空间的特点。
b ndarray的创建:
1) 使用np.array()创建: 最简单的方法是使用 numpy 提供的 array() 函数直接将 Python 数组转换为 ndarray 数组,array() 接受一切序列类型的对象,例如将一个列表转换成 ndarray 数组.
import numpy as np #一维数组的创建 np.array([1,2,3,4,5]) # 二维数组的创建 np.array([[1,2,3], [3, 4, 5]]) np.array([[1, 2, 3], ['a', 4, 5]]) #注意: 1 numpy默认ndarray的所有元素的类型是相同的 # 2 如果传过来的列表包含不同的类型,则统一为 # 统一类型,优先级: str > float > int
2) 使用matplotlib.pyplot获取一个numpy数组, 数据来源于同一张图片
import matplotlib.pyplot as plt img_arr = plt.imread('1.jpg') plt.imshow(img_arr) img_arr.shape
3) 使用np.ones方法创建 :np.ones(shape, dtype=None, order='C')
np.ones(shape=(20, 30))
4) 使用np.full方法创建: np.full(shape, fill_value, dtype=None, order='C')
np.full(shape=(5,6), fill_value=100)
5) 使用np.linspace方法创建: np.linspace(start, stop, num=50, endpoint=True, retstep=False,dtype=None)等差数列
np.linspace(1, 100, num=20)
6) 使用np.arange方法创建: np.arange([start, ]stop, [step, ]dtype=None)
np.arange(0,100, step=2)
7) 使用np.random.randint(low, high=None, size=None, dtype='I')
np.random.seed(14) #固定时间种子,产生的随机数就固定下来了 np.random.randint(0,100,size=(5,7))
8) 使用np.random.randn(d0,d1,d2....dn) 标准正态分布
arr = np.random.randn(4,4)
9) 使用np.random.random(size=None) 生成0到1的随机数, 左闭右开
np.random.random(size=(3, 4))
c : ndarray属性
1) 4个必记的参数: ndim 维度; shape 形状 ; size 总长度 ; dtype 元素类型
d : ndarray基本操作
1) 索引: 一维与列表完全一致,多维时同理
2) 切片: 一维与列表完全一致,多维时同理
# 左边是行,右边是列 arr = np.random.randint(60,120,size=(6,4)) # 获取前两行的数据 # arr[0:2] # 获取二维数组的前2列 # arr[:, 0:2] # 获取前两行和前两列的数据 # arr[0:2,0:2] # 将数据反转 ::进行切片 # 将数组的行倒序 # arr[::-1] # 将数组的列倒序 # arr[:, ::-1] # 全部倒序 arr[::-1, ::-1]
3) 变形 : 使用arr.reshape()函数, 注意参数是一个tuple!基本使用:
将一维数组转变为多维数组
arr2 = np.random.randint(20,30, size=(6,4)) arr2 # 转变为一维数组 arr12 = arr2.reshape(24) arr12 # 转变成三维数组 arr32 = arr2.reshape(2,4,3) arr32 # 自动计算行和列 arr4 = arr2.reshape(3,-1) arr4 arr5 = arr2.reshape(-1,6) arr5
4) 级联 一维数组 二维数组 多维数组的级联, 实际操作中级联多为二维数组
np.concatenate() axis=0表示的是竖直方向 1水平方向
arr1 = np.random.randint(0,100, size=(3,4)) arr2 = np.random.randint(0,100, size=(3,4)) np.concatenate((arr1,arr2), axis=1) 水平方向 np.concatenate((arr1,arr2), axis=0) 竖直方向
5) 切分: 与级联类似, 三个函数完成切分工作: np.split(arr,行/列,轴): 参数2是一个列表类型 np.vsplit np.hsplit
import matplotlib.pyplot as plt img_arr = plt.imread('./1.jpg') plt.imshow(img_arr) imgs = np.split(img_arr,[100,300],axis=0) plt.imshow(imgs[1])
6) 副本: 所有赋值操作不会为ndarray的任何元素创建副本, 对赋值后的对象的操作也会对原来的对象生效.
可使用copy创建副本.
arr = np.array([1,2,3,4,5]) a = arr a[1] = 10 print(arr) arr1 = arr.copy() arr1[0] = 20
e : ndarray的聚合操作
arr.sum() arr.std() arr.mean()
f: 广播机制
ndarray广播机制的三条规则:
缺失维度的数组, 则维度补充为进行运算的数组的维度.缺失的数组元素使用已有元素进行补充.
规则一: 为缺失的维度补1
规则二: 缺失元素用已用值补充
规则三: 缺失维度的数组只能有一行或者是一列
例一: m = np.ones((2,3)) a = np.arange(3) 求m + a # 两行三列的矩阵1 m = np.ones((2,3)) # 一维数组0,1,2 a = np.arange(3) m+a a = np.arange(3).reshape(3,1) b = np.arange(3) a+b 习题3 : a = np.ones((4,1)) b = np.arange(4) 求a+b a = np.ones((4,1)) b = np.arange(4) a+b
h : ndarray排序
# 1 快速排序np.sort()与ndarray.sort()都可以, 但有区别: # np.sort()不改变输入 # ndarray.sort()本地处理, 不占用空间, 但改变输入. arr = np.array([3,8,5,7,6]) arr # 排序 np.sort(arr)
部分排序
2 部分排序 np.partition(a,k) 有的时候我们不会对全部的数据感兴趣, 我们可能对最小的或者最大的一部分感兴趣. 当k为正时, 我们想得到最小的k个数 当k为负时, 我们想得到最大的k个数 arr = np.array([1,2,3,4,5]) np.partition(arr, kth=4)