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:
    • 直接删除含有缺失值的样本;
    • 替换/插补 (补入平均值或中位数);


最后

新人制作,如有错误,欢迎指出,感激不尽!
如需转载,请标注出处!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

多氯环己烷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值