Python 数据挖掘 | 第2章 使用 Numpy 操作数据
前言
参考资料:
《B站:黑马程序员Python教程,4天快速入门Python数据挖掘,系统精讲+实战案例》
1. Numpy 概述
- Numpy (Numerical Python) 是一个开源的 Python 科学计算库,用于快速处理任意维度的数组;
- Numpy 支持常见的数组和矩阵操作。对于同样的数值计算任务,使用 Numpy 比直接使用 Python 要简洁的多;
- Numpy 使用 ndarray 对象来处理多维数组,该对象是一个快速而灵活的大数据容器;
2. N 维数组 - ndarray 属性
- Numpy 提供了一个 N dimension array,即 n 维数组;
- numpy 与 list 对比:
- 存储风格:
- ndarray 内部存储类型相同,存储空间连续,但通用性不强;
- list 内部存储类型可以不同,存储空间未必连续,通用性较强;
- 并行化计算:ndarray 支持向量化运算;
- 底层语言:
- Numpy 底层采用 C 语言编写,内部解除了 GIL(全局解释器锁),其对数组的操作速度不受 Python 解释器的限制,效率远高于纯 Python 代码;
- 存储风格:
2.1 常用属性
ndarray.shape
:数组维度的元组;ndarray.ndim
:数组维数;ndarray.size
:数组中的元素数量;ndarray.itemsize
:一个数组元素的长度(字节);ndarray.dtype
:数组元素的类型。不指定类型时整数默认 int64,小数默认 float64;
3. 基本操作
3.1 生成数组
zeros(shape=(3, 4), dtype="float32")
:生成一组 0。返回 ndarray 数组;ones(shape=[2, 3], dtype=np.int32)
:生成一组 1。返回 ndarray 数组;array(score)
:深拷贝。返回 ndarray 数组;copy(score)
:深拷贝。返回 ndarray 数组;asarray(score)
:浅拷贝,相当于别名,与原数组修改一致。返回 ndarray 数组;linspace(start, stop, num, endpoint, retstep, dtype)
:生成[start,stop]之间等距离的 num 个数。endpoint:是否包含 stop,默认包含;restep:是否返回样例以及联系数组之间的步长;dtype:数据类型。返回 ndarray 数组;arange(0, 11, 5)
:[0,11),5为步长生成数组 [0,10]。返回 ndarray 数组;random.uniform(low=-1, high=1, size=1000000)
:生成均匀分布的一组数[low,high),个数为 size。返回 ndarray 数组;random.normal(loc=1.75, scale=0.1, size=1000000)
:生成正态分布的一组数,loc:均值(对称轴);scale:标准差(越大越胖);size:个数。返回 ndarray 数组;
3.2 数组的索引、切片
stock_change = np.random.normal(loc=0, scale=1, size=(8, 10))
# 获取第一个股票的前3个交易日的涨跌幅数据
print(stock_change[0, :3])
a1[1, 0, 2] = 100000
3.3 形状修改
ndarray.reshape((y, x))
:返回新的 ndarray,原始数据没有改变;ndarray.resize((y, x))
:没有返回值,对原始的 ndarray 进行了修改;ndarray.T
:转置 行变成列,列变成行;
3.4 类型修改
ndarray.astype("int32")
:转成指定参数类型;ndarray.tostring()
:ndarray 序列化到本地;;
3.5 数组去重
np.unique(ndarray)
:用 numpy 的函数去重;set(ndarray.flatten())
:通过 set 集合去重;
4. ndarray 运算
4.1 逻辑运算
- 运算符:
ndarray > x
:如果涨跌幅大于 x 就标记为 True 否则为 False。返回 shape 跟原数组一样,dtype 为布尔值的 ndarray 数组;ndarray[ndarray > x]
:返回原 ndarray 中大于 x 的元素。会改变原数组值;- 通用判断函数:
np.all(布尔值)
:只要有一个 False 就返回 False,全 True 才返回 True(逻辑与);np.any(布尔值)
:只要有一个 True 就返回 True,全 False 才返回 False(逻辑或);- 三元运算符:
np.where(布尔值,True的位置的值,False的位置的值)
:传入三元运算符;np.logical_and(temp > x, temp < y)
:大于 x 且小于 y;np.logical_or(temp > x, temp < y)
:大于 x 或小于 y;
code1 基本操作、逻辑运算代码示例
# 案例:随机生成8只股票2周的交易日涨幅数据
stock_change = np.random.normal(loc=0, scale=1, size=(8, 10))
# 1.基本操作
# 1.1 切片:获取第一个股票的前3个交易日的涨跌幅数据
var = stock_change[0, :3]
# 1.2 索引
a1 = np.array([ [[1,2,3],[4,5,6]], [[12,3,34],[5,6,7]]])
a1[1, 0, 2] = 100000
# 1.3 形状修改
stock_change.reshape((10, 8)) # 返回新的ndarray,原始数据没有改变
stock_change.resize((10, 8)) # 没有返回值,对原始的ndarray进行了修改
print(stock_change.T) # 转置 行变成列,列变成行
# 1.4 类型修改
stock_change.astype("int32")
stock_change.tostring() # ndarray序列化到本地
# 1.5 数组去重
np.unique(stock_change)
# 2.逻辑运算
# 2.1 运算符
# 逻辑判断, 如果涨跌幅大于0.5就标记为True 否则为False
print(stock_change > 0.5)
stock_change[stock_change > 0.5] = 1.1
# 2.2 通用判断函数
np.all(stock_change[0:2, 0:5] > 0) # 判断stock_change[0:2, 0:5]是否全是上涨的
np.any(stock_change[:5, :] > 0) # 判断前5只股票这段期间是否有上涨的
# 2.3 三元运算符
temp = stock_change[:4, :4]
np.where(temp > 0, 1, 0)
np.where(np.logical_and(temp > 0.5, temp < 1), 1, 0) # 大于0.5且小于1
np.where(np.logical_or(temp > 0.5, temp < -0.5), 11, 3) # 大于0.5或小于-0.5
4.2 统计运算
- 写法:ndarray.max() = np.max(ndarray)
ndarray.max(axis=)
:求数组中的最大值,axis=0 时求每列最大值,axis=1 时求每行最大值。shape(0,1);ndarray.min()
:求数组中的最小值;ndarray.argmax(ndarray, axis=)
:求最大值所在索引;ndarray.argmin(ndarray, axis=)
:求最小值所在索引;ndarray.mean()
:求数组的算术平均值;ndarray.median()
:求数组中的中位数;ndarray.var()
:求数组的方差;ndarray.std()
:求数组的标准差;
5. 数组间的运算
5.1 数组与数的运算
ndarray +1
:对数组的每一个元素 + 1,其他操作同理;
5.2 数组与数组的运算
- 数组与数组的运算需要满足广播机制:
- 执行broadcast的前提在于,两个nadarray执行的是element-wise的运算,Broadcast机制的功能是为了方便不同形状的ndarray(numpy库的核心数据结构)进行数学运算;
- 当操作两个数组时,numpy会逐个比较它们的shape(构成的元组tuple),只有在下述情况下,两个数组才能够进行数组与数组的运算;
- 维度相等;
- shape(其中相对应的一个地方为1)
5.3 矩阵运算
-
存储矩阵的两种方法:
-
np.ndarray( [[], [], []] )
:ndarray 二维数组; -
np.mat( [[], [], []] )
:matrix 存储矩阵; -
矩阵乘法:
- 条件:
- 形状:(m, n) * (n, l) = (m, l) ;
- 运算规则
- 条件:
-
np.dot(ndarray_0, ndarray_1)
:矩阵乘法; -
np.matmul(ndarray_0, ndarray_1)
:矩阵乘法; -
ndarray_0 @ ndarray_1
:矩阵乘法;
6. 合并与分割(了解)
- 合并:
np.hstack((a, b))
:水平拼接;np.vstack((a, b))
:竖拼接;np.concatenate((a, b), axis=1)
:axis=0 为水平拼接,axis=1 为竖拼接;- 分割
np.split(ndarray, x)
:按照 x 的索引将 ndarray 分割;
7. IO 操作与数据处理(了解)
np.genfromtxt("test.csv", delimiter=",")
:读取数据。delimiter:分隔符。会有问题,读不出字符串;- 两种思路处理缺失值 nan:
- 直接删除含有缺失值的样本;
- 替换/插补 (补入平均值或中位数);