机器学习-数据科学库 04 numpy 教程

本文介绍NumPy的基础用法,包括数组创建、数组形状修改、索引与切片、广播等核心概念,并提供实用示例,如如何处理含有NaN的数据。

简介

https://numpy.org/

The fundamental package for scientific computing with Python

数组创建

import numpy as np

# 使用 numpy 生成数组,得到ndarray的类型
t1 = np.array([1, 2, 3, ])
t2 = np.array(range(10))

# 直接生成 ndarray
t3 = np.arange(4, 10, 2)

# 指定元素的类型创建数组
# https://numpy.org/doc/stable/reference/arrays.dtypes.html
t4 = np.array(range(1, 4), dtype="i1")
print(t4)

# ndarray 的元素类型
# 根据系统架构 如 x64 为 int64
print(t4.dtype)

# numpy中的bool类型
t5 = np.array([1, 1, 0, 1, 0, 0], dtype=bool)

# 取小数点后几位
t7 = np.array([random.random() for i in range(10)])
t8 = np.round(t7, 2)

数组形状

# 查看数组形状
arr.shape


# 修改数组形状
arr.reshape(3, 4)
arr.reshape(2, 3, 2)

arr.reshape((arr.size(), ))


广播

# 每个元素都 + * /标量
arr = arr + 3
arr = arr * 3
arr = arr / 3

# 相同维度矩阵对应元素运算
arr = arr1 + arr2
arr = arr1 * arr2
arr = arr1 / arr2

# 不同维度数组,广播原则
# 从末尾开始算起的维度相符或者其中一方为1,广播兼容。广播会在缺失或者长度为1的维度进行
# https://numpy.org/doc/stable/user/basics.broadcasting.html
arr3x4 = arr3x4 - arr3x1

# 不能计算
arr = arr3x3x3 - arr3x2

# 可以计算
arr = arr3x3x2 - arr3x3
arr = arr3x3x2 - arr3x2

例子,二维数组,每列分别减去列平均值

t7 = np.array([random.random() for i in range(20)])
t7 = t7.reshape((4, 5))

# 每一列求平均值后,按列分别计算差值
t7 = t7 - numpy.average(t7, 0)

  • 对于 1 维数组有 0 轴,对于 2 为住宿有 0,1 轴,以此类推

读取本地数据

# https://numpy.org/doc/stable/reference/generated/numpy.loadtxt.html
# unpack = 转置
t2 = np.loadtxt(file_path, delimiter=",", dtype="int", unpack=False)

转置

t = t.transpose()
t = t.T

# 交换轴
t = t.swapaxes(1, 0)

索引和切片

二维数组例子:

# 取某行
out = data[2]

# 取连续的多行到结尾
out = data[2:]

# 取指定的多行
out = data[[2, 8, 10]]

# 取指定列
out = data[:, 1]

# 取列到末尾
out = data[:, 2:]

# 取指定的列
out = data[:, [0, 2]]

# 取指定行指定列
out = data[2, 3]

# 取指定多行指定多列
out = data[2:5, 1:4]

# 取多个不相邻的点结果是一维数组
out = data[[0, 2], [0, 1]]

数值修改

布尔索引

# 获取所有指定条件值
out = data[data < 10]

# 修改所有小于 10 的数据,改为3
# 原地修改
data[data < 10] = 3

# 三元运算符
# 小于 3 则为 100 否则 300
np.where(n <= 3, 100, 300)

裁剪

# 对每个元素的值进行上下限裁剪
out = data.clip(10, 18)

赋值 nan

nan = not a number,

  • 类型为 float
  • 0 / 0 会出现
  • 输入文件缺失或者 cast 异常
  • inf 正无穷 -inf 负无穷
  • nan == nanFalse
  • nan 任何操作结果都是 nan
  • 注意点:
    • 一般 nan 考虑影响,替换为 均值 or 中值(排序后中间的),不见已替换为 0
# 转换类型为 float
data = data.astype(float)

# 赋值
data[i, j] = numpy.nan

# 判断 nan 个数
numpy.count_nonzero(data != data)
numpy.count_nonzero(numpy.isnan(data))

统计函数

默认返回多维数组的全部的统计结果,如果指定axis则返回一个当前轴上的结果


# 求和
t.sum(axis=None)

# 均值
t.mean(a,axis=None)  受离群点的影响较大

# 中值
np.median(t,axis=None) 


# 最大值
t.max(axis=None) 

# 最小值
t.min(axis=None)

# 极值
np.ptp(t,axis=None) 即最大值和最小值只差

# 标准差
# 一组数据对平均值的分散程度
t.std(axis=None) 

例子,替换 nan 为每列均值

# coding=utf-8
import numpy as np

# print(t1)
def fill_ndarray(t1):
    for i in range(t1.shape[1]):  #遍历每一列
        temp_col = t1[:,i]  #当前的一列
        nan_num = np.count_nonzero(temp_col!=temp_col)
        if nan_num !=0: #不为0,说明当前这一列中有nan
            temp_not_nan_col = temp_col[temp_col==temp_col] #当前一列不为nan的array

            # 选中当前为nan的位置,把值赋值为不为nan的均值
            temp_col[np.isnan(temp_col)] = temp_not_nan_col.mean()
    return t1

if __name__ == '__main__':
    t1 = np.arange(24).reshape((4, 6)).astype("float")
    t1[1, 2:] = np.nan
    print(t1)
    t1 = fill_ndarray(t1)
    print(t1)

数据拼接

二维数组拼接:

# 竖直拼接
# 对应 numpy.vsplit()
numpy.vstack((t1, t2))

# 水平拼接
# 对应 numpy.hsplit()
numpy.hstack((t1, t2))

行列交换

# 交换1,2行
t[[1, 2], :] = t[[2, 1], :]

# 交换1,2列
t[:, [1, 2]] = t[, [2, 1]]

工具方法

# 获取按照某个轴,最大值最小值的位置,输出是一维数组
np.argmax(t, axis=0)
np.argmin(t, axis=1)

# 创建一个全0的数组
np.zeros((3, 4))

# 创建一个全1的数组
np.ones((3, 4))

# 创建一个对角线为1的正方形数组(方阵)
np.eye(3)

随机方法

# n 维随机数组
np.random.rand(d0, d1, ..dn)

# n 维正态分布随机数组
np.random.randn(d0, d1, ..dn)

# 按 shape 和上下限随机整型
np.random.randint(low, high, (shape))

# 均匀分布
np.random.randint(low, high, (size))

# 正态分布抽取样本
np.random.normal(low, high, (size))

# s 为种子随机
np.random.seed(s)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值