NumPy Tips

在机器学习领域中,NumPy是最基本的数据结构,用于存储矩阵和执行与矩阵计算相关的操作。本文分享一些关于NumPy的使用小技巧,通过矩阵计算避免循环逻辑。

  • 概率矩阵 转 OneHot矩阵
  • 列表的置信区间
  • 桶区间索引列表
  • 异常值检测
  • 连续列表离散化
  • 一维矩阵升降维

概率矩阵 转 OneHot矩阵

在多分类过程中,经常需要将概率矩阵转换为One-Hot矩阵,用于验证模型效果。

  1. 计算概率矩阵中每一行的最大值位置;
  2. 创建与类别维度相同的对角线矩阵;
  3. 根据最大位置, 选择对角线矩阵相应的行, 即One-Hot矩阵。

源码实现:

import numpy as np

def prp_2_oh_array(arr):
    """
    概率矩阵转换为OH矩阵
    arr = np.array([[0.1, 0.5, 0.4], [0.2, 0.1, 0.6]])
    :param arr: 概率矩阵
    :return: OH矩阵
    """
    arr_size = arr.shape[1]  # 类别数
    arr_max = np.argmax(arr, axis=1)  # 最大值位置
    oh_arr = np.eye(arr_size)[arr_max]  # OH矩阵
    return oh_arr
复制代码

输出:

[[0. 1. 0.]
 [0. 0. 1.]]
复制代码

列表的置信区间

当桶编码数字列表时,需要使用置信区间进行处理异常值,和桶区间的划分。

import numpy as np
from scipy import stats

def mean_confidence_interval(data_list, confidence=0.95):
    """
    置信区间
    data_list = [1, 2, 3, 4, 5, 6, 10]
    (4.428571428571429, 1.6613839667258272, 7.19575889041703)
    :param data_list: 数字列表
    :param confidence: 置信度
    :return: 均值和置信区间
    """
    a = 1.0 * np.array(data_list)
    n = len(a)
    m, se = np.mean(a), stats.sem(a)
    h = se * stats.t.ppf((1 + confidence) / 2., n - 1)
    return m, m - h, m + h
复制代码

桶区间索引列表

使用**digitize()**函数,将不同的数字放入桶中,即将连续列表离散化。注意:桶数是区间数的长度加1,左右两侧均有,从0开始。

import numpy as np

x = np.array([0.1, 6.4, 3.0, 1.6, 25, 30])
bins = np.array([1.0, 2.5, 4.0, 10.0])  # 区间包含首位,即len+1
inds = np.digitize(x, bins)  # 转换为桶的值
print inds
复制代码

输出:

[0 3 2 1 4 4]
复制代码

异常值检测

将数据中的异常值(Outlier)替换为最大值和最小值,避免对于分布的形态造成干扰。

import numpy as np

def filter_outliers(data, m=1):
    """
    异常值检测
    data = np.array([-100, 0.1, 6.4, 3.0, 1.6, 25, 30, 100])
    [ 0.1  0.1  6.4  3.   1.6 25.  30.  30. ]
    :param data: 数据列表
    :param m: 偏离标准差的数量
    :return: 去除标准差的数据
    """
    std_arr = data[abs(data - np.mean(data)) < m * np.std(data)]
    max_ol = data - np.mean(data) > m * np.std(data)
    min_ol = data - np.mean(data) < -m * np.std(data)
    data[max_ol] = np.max(std_arr)
    data[min_ol] = np.min(std_arr)
    return data
复制代码

连续列表离散化

将连续列表离散化,去除异常值,基于置信度进行分区。其中,函数filter_outliersmean_confidence_interval参考上文实现。

import numpy as np

def continuous_list_to_discrete(cont_list, bc=32, confidence=0.95):
    """
    连续数据离散化,含有去除异常值
    x = np.array([-100, 0.1, 6.4, 3.0, 1.6, 25, 30, 100])
    [ 0  0  8  4  2 31 31 31]
    :param cont_list: 连续列表
    :param bc: 桶数量
    :param confidence: 置信度
    :return: 离散列表
    """
    cont_list = filter_outliers(cont_list)  # 去除异常值
    m, h = mean_confidence_interval(cont_list, confidence)
    bins = np.linspace(m - h, m + h, bc - 1)  # 桶数量减1为区间数
    dis_list = np.digitize(cont_list, bins)  # 转换为桶的值
    return dis_list
复制代码

一维矩阵升降维

在测试算法中,需要调整测试数据的维度。对于一条测试样本,即一维矩阵,使用expand_dims进行升维。反向操作,则使用squeeze进行降维。

import numpy as np

print "一维矩阵: "
arr = np.array([1, 2, 3])
print arr
print arr.shape

print "\n升维: "
arr = np.expand_dims(arr, axis=0)
print arr
print arr.shape

print "\n降维: "
arr = np.squeeze(arr)
print arr
print arr.shape
复制代码

输出

一维矩阵: 
[1 2 3]
(3,)

升维: 
[[1 2 3]]
(1, 3)

降维: 
[1 2 3]
(3,)
复制代码

欢迎Follow我的GitHub:https://github.com/SpikeKing

By C. L. Wang @ 美图云事业部

OK, that's all!

Traceback (most recent call last): File "D:\python\lib\site-packages\numpy\core\__init__.py", line 23, in <module> from . import multiarray File "D:\python\lib\site-packages\numpy\core\multiarray.py", line 10, in <module> from . import overrides File "D:\python\lib\site-packages\numpy\core\overrides.py", line 8, in <module> from numpy.core._multiarray_umath import ( ModuleNotFoundError: No module named 'numpy.core._multiarray_umath' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "D:\neox_tools-master\neox_tools-master\onmyoji_converter.py", line 2, in <module> import numpy as np File "D:\python\lib\site-packages\numpy\__init__.py", line 139, in <module> from . import core File "D:\python\lib\site-packages\numpy\core\__init__.py", line 49, in <module> raise ImportError(msg) ImportError: IMPORTANT: PLEASE READ THIS FOR ADVICE ON HOW TO SOLVE THIS ISSUE! Importing the numpy C-extensions failed. This error can happen for many reasons, often due to issues with your setup or how NumPy was installed. We have compiled some common reasons and troubleshooting tips at: https://numpy.org/devdocs/user/troubleshooting-importerror.html Please note and check the following: * The Python version is: Python3.8 from "D:\python\python.exe" * The NumPy version is: "1.25.0" and make sure that they are the versions you expect. Please carefully study the documentation linked above for further help. Original error was: No module named 'numpy.core._multiarray_umath'
07-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值