当前位置: 首页 > news >正文

【100天精通Python】Day52:Python 数据分析_Numpy入门基础与数组操作

目录

1  NumPy 基础概述

1.1 NumPy的主要特点和功能

1.2 NumPy 安装和导入

2 Numpy 数组

2.1 创建NumPy数组

2.2 数组的形状和维度

2.3 数组的数据类型

2.4 访问和修改数组元素

3 数组操作

3.1 数组运算

3.2 数学函数

3.3 统计函数

4 数组形状操作

4.1 重塑数组形状

4.2 数组的转置

4.3 数组展平

4.4 改变数组的大小

4.5 堆叠数组

4.6 拆分数组


1  NumPy 基础概述

        NumPy(Numerical Python)是Python中用于数值计算的核心库之一。它提供了多维数组对象(称为ndarray),以及用于在这些数组上执行各种数学、逻辑、统计和线性代数操作的函数。NumPy是数据科学、机器学习、科学计算和工程领域的重要工具,它的设计目标是提供高性能、灵活性和易用性的数值计算工具。

1.1 NumPy的主要特点和功能

  1. 多维数组对象(ndarray):NumPy的核心数据结构是ndarray,这是一个类似于列表的多维数组,但具有以下特点:

    • 所有元素必须是相同数据类型。
    • 数组的形状可以是任意的,可以是一维、二维、三维等。
    • 数组的元素可以通过索引和切片访问。
  2. 高性能计算:NumPy的数组操作在底层是使用高度优化的C语言实现的,因此能够以非常高效的方式执行数值计算。这使得NumPy成为处理大规模数据集的首选工具。

  3. 广泛的数学函数:NumPy提供了丰富的数学函数,包括基本的算术操作、三角函数、指数和对数、统计函数、线性代数函数等。

  4. 随机数生成:NumPy包含随机数生成器,用于生成随机数和随机数组。这对于模拟和随机实验非常有用。

  5. 广播功能:NumPy允许您在不同形状的数组之间进行操作,通过广播功能,使得这些操作能够自动适应不同形状的数组,而无需显式编写循环。

  6. 文件输入输出:NumPy支持多种文件格式的读写,包括文本文件、二进制文件和NumPy的自定义二进制格式。

  7. 线性代数运算:NumPy提供了一组丰富的线性代数函数,如矩阵乘法、逆矩阵、特征值分解、奇异值分解等。

  8. 数据分析和科学计算:NumPy通常与其他库(如Pandas、SciPy和Matplotlib)一起使用,以进行数据分析、科学计算、数据可视化等任务。

  9. 开源和社区支持:NumPy是开源项目,拥有庞大的用户和开发者社区,因此您可以轻松获得文档、教程和支持。

        总之,NumPy是Python中不可或缺的库,它为数值计算提供了强大的工具,使得在Python中进行科学计算和数据分析变得更加方便和高效。如果您在数据科学、工程或科学研究方面工作,学习和掌握NumPy是非常重要的一步。您可以通过安装NumPy并查阅其官方文档来开始使用它。

 Numpy 官方手册:NumPy user guide — NumPy v1.25 Manualicon-default.png?t=N7T8https://numpy.org/doc/stable/user/index.html#user

1.2 NumPy 安装和导入

在使用NumPy之前,需要先安装它。您可以使用以下命令通过pip安装NumPy:

(1)用conda安装:

# Best practice, use an environment rather than install in the base env
conda create -n my-env
conda activate my-env
# If you want to install from conda-forge
conda config --env --add channels conda-forge
# The actual install command
conda install numpy

(2)用pip安装:

pip install numpy

安装完成后,您可以在Python中导入NumPy:

import numpy as np

        通常,人们将NumPy导入为np,以简化代码中的引用。 现在,您已经准备好开始使用NumPy进行数值计算了。

2 Numpy 数组

2.1 创建NumPy数组

使用np.array()函数可以从Python列表或元组创建NumPy数组:

# 创建一个一维数组
arr1 = np.array([1, 2, 3, 4, 5])# 创建一个二维数组
arr2 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

2.2 数组的形状和维度

NumPy数组具有形状(shape)和维度(dimension),可以使用以下属性获取:

shape = arr.shape  # 形状,返回 (5,) 表示一维数组
dim = arr.ndim    # 维度,返回 1 表示一维数组

2.3 数组的数据类型

每个NumPy数组都有一个数据类型,可以使用dtype属性查看:

dtype = arr.dtype  # 返回数组的数据类型,如int64

2.4 访问和修改数组元素

您可以使用索引和切片来访问和修改数组的元素

element = arr[2]       # 获取索引为2的元素,值为3
sub_array = arr[1:4]   # 获取索引1到3的元素,结果为[2, 3, 4]
arr[0] = 10            # 修改索引0的元素为10

3 数组操作

3.1 数组运算

        NumPy支持对数组执行各种数学运算,例如加法、减法、乘法和除法。这些运算是按元素执行的:

import numpy as nparr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])# 加法
result_addition = arr1 + arr2  # [5, 7, 9]# 减法
result_subtraction = arr1 - arr2  # [-3, -3, -3]# 乘法
result_multiplication = arr1 * arr2  # [4, 10, 18]# 除法
result_division = arr1 / arr2  # [0.25, 0.4, 0.5]

3.2 数学函数

NumPy提供了丰富的数学函数,您可以对整个数组或数组的元素进行操作。以下是一些示例:

import numpy as np# 数组用于演示数学函数的功能
arr = np.array([0, 1, 2, 3, 4, 5])# 计算指数函数
exp_values = np.exp(arr)
# exp_values 现在包含了arr中每个元素的e的幂次方结果# 计算自然对数函数(对数的逆函数)
log_values = np.log(arr + 1)
# 这里使用(arr + 1)来避免对0进行对数运算,因为对数函数不定义于0# 计算平方根
sqrt_values = np.sqrt(arr)
# sqrt_values 现在包含了arr中每个元素的平方根# 计算正弦函数
sin_values = np.sin(arr)
# sin_values 包含arr中每个元素的正弦值# 计算余弦函数
cos_values = np.cos(arr)
# cos_values 包含arr中每个元素的余弦值# 计算反正弦函数
asin_values = np.arcsin(arr / 5)
# asin_values 包含arr中每个元素的反正弦值# 计算反余弦函数
acos_values = np.arccos(arr / 5)
# acos_values 包含arr中每个元素的反余弦值# 计算四舍五入的整数值
round_values = np.round(arr / 2)
# round_values 包含arr中每个元素除以2并四舍五入后的整数值

具体示例:

import numpy as np# 求绝对值
absolute_value = np.abs([-1, -2, 3])  # [1 2 3]# 计算平方根
sqrt_value = np.sqrt([4, 9, 16])  # [2. 3. 4.]# 计算指数函数
exp_value = np.exp([1, 2, 3])  # [ 2.71828183  7.3890561  20.08553692]# 计算自然对数
log_value = np.log([1, 10, 100])  # [0. 2.30258509 4.60517019]# 计算以2为底的对数
log2_value = np.log2([1, 2, 4])  # [0. 1. 2.]# 计算以10为底的对数
log10_value = np.log10([1, 10, 100])  # [0. 1. 2.]# 计算幂函数
power_value = np.power([2, 3, 4], [2, 3, 2])  # [ 4 27 16]# 计算三角函数
sin_value = np.sin(np.pi / 2)  # 1.0
cos_value = np.cos(np.pi)  # -1.0# 计算反三角函数
arcsin_value = np.arcsin(1)  # 1.5707963267948966
arccos_value = np.arccos(0)  # 1.5707963267948966# 计算正切函数
tan_value = np.tan(np.pi / 4)  # 0.9999999999999999# 计算反正切函数
arctan_value = np.arctan(1)  # 0.7853981633974483# 计算双曲正弦函数
sinh_value = np.sinh(1)  # 1.1752011936438014# 计算双曲余弦函数
cosh_value = np.cosh(1)  # 1.5430806348152437# 计算双曲正切函数
tanh_value = np.tanh(1)  # 0.7615941559557649# 计算双曲反正弦函数
arcsinh_value = np.arcsinh(1)  # 0.881373587019543# 计算双曲反余弦函数
arccosh_value = np.arccosh(2)  # 1.3169578969248166# 计算双曲反正切函数
arctanh_value = np.arctanh(0.5)  # 0.5493061443340548# 计算四舍五入
round_value = np.round([1.2, 2.7, 3.5])  # [1. 3. 4.]# 计算向上取整
ceil_value = np.ceil([1.2, 2.7, 3.5])  # [2. 3. 4.]# 计算向下取整
floor_value = np.floor([1.2, 2.7, 3.5])  # [1. 2. 3.]

        以上是一系列NumPy中数学函数的示例,包括绝对值、平方根、指数函数、自然对数、以2为底的对数、以10为底的对数、幂函数、三角函数、反三角函数、双曲函数、反双曲函数、四舍五入、向上取整和向下取整。这些函数允许您执行各种数学运算和变换,对数据进行处理和分析。

3.3 统计函数

        NumPy提供了各种统计函数,可以帮助您分析数组的统计属性,如均值、总和、最大值和最小值等。以下是示例:

import numpy as np# 创建一个示例数组
data = np.array([1, 2, 2, 3, 3, 3, 4, 4, 4, 4])# 计算平均值
mean = np.mean(data)  # 平均值为 3.0# 计算中位数
median = np.median(data)  # 中位数为 3.0# 计算众数
from scipy import stats
mode = stats.mode(data)  # 众数为 ModeResult(mode=array([4]), count=array([4]))# 计算标准差
std_deviation = np.std(data)  # 标准差为 1.118033988749895# 计算方差
variance = np.var(data)  # 方差为 1.25# 计算最小值和最大值
min_value = np.min(data)  # 最小值为 1
max_value = np.max(data)  # 最大值为 4# 计算百分位数
percentile_25 = np.percentile(data, 25)  # 25th 百分位数为 2.25
percentile_75 = np.percentile(data, 75)  # 75th 百分位数为 3.75# 计算数据范围
data_range = np.ptp(data)  # 数据范围为 3# 计算数据的四分位距
iqr = np.percentile(data, 75) - np.percentile(data, 25)  # 四分位距为 1.5# 计算数据的和
total_sum = np.sum(data)  # 总和为 30# 计算累积和
cumulative_sum = np.cumsum(data)  # [ 1  3  5  8 11 14 18 22 26 30]# 计算累积积
cumulative_product = np.cumprod(data)  # [     1      2      4     12     36    108    432   1728   6912  27648]# 计算均方根(Root Mean Square)
rms = np.sqrt(np.mean(np.square(data)))  # 均方根为 2.160246899469287# 计算协方差矩阵
data1 = np.array([1, 2, 3, 4, 5])
data2 = np.array([5, 4, 3, 2, 1])
covariance_matrix = np.cov(data1, data2)  # 结果是一个协方差矩阵# 计算相关系数
correlation_coefficient = np.corrcoef(data1, data2)  # 结果是相关系数矩阵

示例演示了如何使用NumPy中的统计函数来计算各种统计量,包括平均值、中位数、众数、标准差、方差、最小值、最大值、百分位数、数据范围、四分位距、总和、累积和、累积积、均方根、协方差矩阵和相关系数。这些函数对于数据分析非常有用。

4 数组形状操作

4.1 重塑数组形状

        重塑数组的形状是常见的操作,特别是在与不同形状的数据进行操作时。使用reshape()函数可以改变数组的形状,但请注意新形状的元素数量必须与原始数组相同。

4.2 数组的转置

        数组的转置操作是将数组的行和列进行交换。您可以使用.T属性来获取数组的转置。

4.3 数组展平

        展平数组意味着将多维数组转换为一维数组。您可以使用ravel()函数或flatten()函数来实现这一目标。

4.4 改变数组的大小

        使用resize()函数可以改变数组的大小,不需要考虑新形状与原始数组的元素数量是否兼容。如果新数组大于原始数组,多余的元素将被填充0。

4.5 堆叠数组

        堆叠数组是将多个数组按垂直或水平方向堆叠在一起。您可以使用vstack()函数垂直堆叠和hstack()函数水平堆叠数组。

4.6 拆分数组

        拆分数组是将一个数组拆分成多个子数组。使用split()函数可以按指定位置拆分数组。

以上示例代码:

import numpy as np# 创建一个示例数组
arr = np.array([[1, 2, 3],[4, 5, 6]])# 1. 重塑数组形状 (reshape)
# 用于改变数组的形状,返回一个新的视图。
reshaped = arr.reshape(3, 2)
# 结果为:
# [[1 2]
#  [3 4]
#  [5 6]]# 2. 数组的转置 (T属性)
# 返回原始数组的转置,即交换行和列。
transposed = arr.T
# 结果为:
# [[1 4]
#  [2 5]
#  [3 6]]# 3. 改变数组的大小 (resize)
# 允许调整数组的大小,可以增加或减少元素的数量。
resized = np.resize(arr, (2, 4))
# 结果为:
# [[1 2 3 4]
#  [5 6 1 2]]# 4. 数组连接 (vstack, hstack)
# vstack用于垂直堆叠多个数组,hstack用于水平堆叠多个数组。
arr1 = np.array([1, 2])
arr2 = np.array([3, 4])
vertical_stack = np.vstack((arr1, arr2))
# 结果为:
# [[1 2]
#  [3 4]]horizontal_stack = np.hstack((arr1, arr2))
# 结果为:
# [1 2 3 4]# 5. 拆分数组 (split)
# 用于将一个数组拆分为多个子数组,可以指定拆分的位置。
split_arr = np.split(arr, 2)
# 在索引2处拆分数组,结果为两个子数组:
# 子数组1: [[1 2 3]]
# 子数组2: [[4 5 6]]# 6. 数组展平 (ravel, flatten)
# ravel和flatten函数用于将多维数组展平为一维数组。
flattened = arr.ravel()
# 结果为一维数组: [1 2 3 4 5 6]# 可以使用flatten()函数进行展平,效果相同:
flattened_using_flatten = arr.flatten()# 7. 更改数组的维度 (ndarray.shape)
# 使用数组的shape属性来直接更改数组的形状。
arr.shape = (3, 2)
# 这会将数组的形状更改为3x2。# 8. 调整数组的大小 (resize)
# resize函数也可用于调整数组的大小,但可以指定refcheck参数以避免数据损失。
resized = np.resize(arr, (2, 4), refcheck=False)
# 结果为:
# [[1 2 3 4]
#  [5 6 1 2]]

        这些数组形状操作在数据预处理、图像处理、机器学习、科学计算等领域都有广泛的应用。它们使得在处理不同形式和维度的数据时更加灵活,并且可以使数据适应不同的算法和任务。

相关文章:

【100天精通Python】Day52:Python 数据分析_Numpy入门基础与数组操作

目录 1 NumPy 基础概述 1.1 NumPy的主要特点和功能 1.2 NumPy 安装和导入 2 Numpy 数组 2.1 创建NumPy数组 2.2 数组的形状和维度 2.3 数组的数据类型 2.4 访问和修改数组元素 3 数组操作 3.1 数组运算 3.2 数学函数 3.3 统计函数 4 数组形状操作 4.1 重塑数组形…...

Day01-Java基础语法

目录 1. 人机交互 1.1 什么是cmd? 1.2 如何打开CMD窗口? 1.3 常用CMD命令 1.4 CMD练习 1.5 环境变量 2. Java概述 1.1 Java是什么? 1.2下载和安装 1.2.1 下载 1.2.2 安装 1.2.3 JDK的安装目录介绍 1.3 HelloWorld小案例 2.3.1 …...

代码随想录二刷day06

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、力扣242. 有效的字母异位词二、力扣349. 两个数组的交集三、力扣202. 快乐数四、力扣1两数之和 前言 一、力扣242. 有效的字母异位词 class Solution {pub…...

可扩展的Blender插件开发汇总

成熟的 Blender 3D 插件是令人惊奇的事情。作为 Python 和 Blender 的新手,我经常发现自己被社区中的人们创造的强大的东西弄得目瞪口呆。坦率地说,其中一些包看起来有点神奇,当自我怀疑或冒名顶替综合症的唠叨声音被打破时,很容易想到“如果有人能做出可以做xxx的东西就好…...

2023_Spark_实验二:IDEA安装及配置

一、下载安装包 链接:百度网盘 请输入提取码 所在文件夹:大数据必备工具--》开发工具(前端后端)--》后端 下载文件名称:ideaIU-2019.2.3.exe (喜欢新版本也可安装新版本,新旧版本会存在部分差异) IDEA …...

小赢科技,寻找金融科技核心价

如果说金融是经济的晴雨表,是通过改善供给质量以提高经济质量的切入口,那么金融科技公司,就是这一切行动的推手。上半年,社会经济活跃程度提高背后,金融科技公司既是奉献者,也是受益者。 8月29日&#xff0…...

NAT与代理服务器

1.DNS Domain Name System 是一整套从域名映射到IP的系统(把域名转化为IP地址) 2.域名简介 3.周鸿祎 傅盛 4.ICMP协议 用来网络故障排查原因 草图理解“位置” ping ICMP 是绕过TCP UDP传输协议的,没有端口号 traceroute 5.NAT技术 N…...

24.排序,插入排序,交换排序

目录 一. 插入排序 (1)直接插入排序 (2)折半插入排序 (3)希尔排序 二. 交换排序 (1)冒泡排序 (2)快速排序 排序:将一组杂乱无章的数据按一…...

Navicat16安装教程

注:因版权原因,本文已去除破解相关的文件和内容 1、在本站下载解压后即可获得Navicat16安装包和破解补丁,如图所示 2、双击“navicat160_premium_cs_x64.exe”程序,即可进入安装界面, 3、点击下一步 4、如图所示勾选“…...

【看表情包学Linux】初识文件描述符 | 虚拟文件系统 (VFS) 初探 | 系统传递标记位 | O_TRUNC | O_APPEND

爆笑教程《看表情包学Linux》👈 猛戳订阅!​​​​​ 💭 写在前面:通过上一章节的讲解,想必大家已对文件系统基本的接口有一个简单的了解,本章我们将继续深入讲解,继续学习系统传递标志位&…...

ssm+vue“魅力”繁峙宣传网站源码和论文

ssmvue“魅力”繁峙宣传网站源码和论文102 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身…...

Linux系统编程5(线程概念详解)

线程同进程一样都是OS中非常重要的部分,线程的应用场景非常的广泛,试想我们使用的视频软件,在网络不是很好的情况下,通常会采取下载的方式,现在你很想立即观看,又想下载,于是你点击了下载并且在…...

leetcode645. 错误的集合(java)

错误的集合 题目描述优化空间代码演示 题目描述 难度 - 简单 LC645 - 错误的集合 集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数…...

Pytest参数详解 — 基于命令行模式

1、--collect-only 查看在给定的配置下哪些测试用例会被执行 2、-k 使用表达式来指定希望运行的测试用例。如果测试名是唯一的或者多个测试名的前缀或者后缀相同,可以使用表达式来快速定位,例如: 命令行-k参数.png 3、-m 标记&#xff0…...

【python爬虫】3.爬虫初体验(BeautifulSoup解析)

文章目录 前言BeautifulSoup是什么BeautifulSoup怎么用解析数据提取数据 对象的变化过程总结 前言 上一关,我们学习了HTML基础知识,知道了HTML是一种用来描述网页的语言,又了解了HTML的基本结构。 认识了HTML中的常见标签和常见属性&#x…...

【Three.js + Vue 构建三维地球-Part One】

Three.js Vue 构建三维地球-Part One Vue 初始化部分Vue-cli 安装初始化 Vue 项目调整目录结构 Three.js 简介Three.js 安装与开始使用 实习的第一个任务是完成一个三维地球的首屏搭建,看了很多的案例,也尝试了用 Echarts 3D地球的模型进行构建&#xf…...

Power View

界面 切换可视化效果 对于已经上传到透视表的数据,选择power view,形成表格后。...

SQL查询本年每月的数据

--一、以一行数据的形式,显示本年的12月的数据,本示例以2017年为例,根据统计日期字段判断,计算总和,查询语句如下:selectsum(case when datepart(month,统计日期)1 then 支付金额 else 0 end) as 1月, sum…...

C++之struct和union对比介绍

C之struct和union对比介绍 在C中,struct和union都是用来定义自定义数据类型的关键字,但它们的作用略有不同。 首先了解一下它们的基本概念: struct(结构体):struct 是一个用户自定义的数据类型&#xff…...

微服务--SkayWalking(链路追踪:国产开源框架)

SkayWalking:分布式系统的应用程序性能监视工具 作用:分布式追踪、性能指标分析、应用、服务依赖分析; SkayWalking性能剖析: 我操,能够定位到某一个方法会有多慢。。。 通过Tid查看全局所有的日志信息&#xff08…...

从入门到上岗,Java+AI 复合型人才养成攻略

当下编程行业格局正在悄然改变,纯 Java 后端岗位内卷日趋严重,薪资增长逐步放缓;纯粹的 AI 算法岗门槛居高不下,对学历、数理功底要求严苛,普通开发者很难入局。 而Java+AI 复合型开发顺势成为行业刚需岗位,既依托成熟的 Java 体系承接业务开发,又能融入人工智能技术实…...

【CP-05】RTE运行时环境 - SWC的操作系统接口

CP-05_RTE运行时环境【CP-05】RTE运行时环境 - SWC的“操作系统接口”前言在AUTOSAR架构中,RTE(Runtime Environment,运行时环境)是一个常被提及却难以理解的概念。它像是应用层软件组件(SW-C)与底层基础软…...

AI圈内火热的Agent、MCP、Skill、CLI是啥?用装修房子讲透,看完秒懂

本文用装修房子的比喻,详细解释了AI领域的四个核心概念:Agent如同会自主规划任务的私人助理;MCP是AI与外部工具数据的统一接口,类似USB-C;Skill是指导AI按标准操作执行的手册;CLI则是不依赖图形界面的命令行…...

告别手动复制!用这个自定义编辑器脚本一键备份/克隆Unity Terrain Data

告别手动复制!用这个自定义编辑器脚本一键备份/克隆Unity Terrain Data在Unity关卡设计和技术美术的工作流中,地形数据的灵活复用往往意味着反复的手动操作——导出高度图、备份材质参数、复制植被分布,每个环节都可能成为效率瓶颈。想象这样…...

Awoo Installer:让Switch游戏安装变得简单高效的终极解决方案

Awoo Installer:让Switch游戏安装变得简单高效的终极解决方案 【免费下载链接】Awoo-Installer A No-Bullshit NSP, NSZ, XCI, and XCZ Installer for Nintendo Switch 项目地址: https://gitcode.com/gh_mirrors/aw/Awoo-Installer 厌倦了繁琐的Switch游戏安…...

Win11Debloat:Windows系统精简与隐私保护的专业解决方案

Win11Debloat:Windows系统精简与隐私保护的专业解决方案 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and …...

终极Obsidian笔记模板指南:如何用kepano-obsidian构建你的第二大脑

终极Obsidian笔记模板指南:如何用kepano-obsidian构建你的第二大脑 【免费下载链接】kepano-obsidian My personal Obsidian vault template. A bottom-up approach to note-taking and organizing things I am interested in. 项目地址: https://gitcode.com/gh_…...

【国家级攻防演练级建议】:DeepSeek私有化部署中4类隐蔽后门植入路径与实时检测方案

更多请点击: https://kaifayun.com 第一章:DeepSeek私有化部署中隐蔽后门植入的攻防对抗本质 在私有化场景下,DeepSeek模型的部署链路常跨越镜像构建、权重加载、推理服务启动及API网关接入等多个环节。攻击者可利用构建上下文污染、依赖包劫…...

收藏干货|2026年程序员转型大模型指南,8个高薪岗位小白也能入局

分享一则身边真实职场经历,想必能戳中当下不少陷入职业迷茫的开发从业者。 同窗老友深耕Java后端开发整整六年,常年扎根业务开发模块,算得上行业内经验老道的技术老手。可从去年年初开始,他的职业焦虑感愈发强烈。传统业务开发同质…...

终极Windows键盘重映射解决方案:SharpKeys完全指南

终极Windows键盘重映射解决方案:SharpKeys完全指南 【免费下载链接】sharpkeys SharpKeys is a utility that manages a Registry key that allows Windows to remap one key to any other key. 项目地址: https://gitcode.com/gh_mirrors/sh/sharpkeys 还在…...