tensor 的计算操作

1、创建tensor

  常见创建 tensor 的方法

函数

作用

torch.Tensor(*size)

通过指定尺寸,生成一个 值全为 0 的 tensor

torch.tensor(*list)

直接通过指定数据,生成tensor,支持 List、Numpy数组

torch.eye(row, column)

按照指定的行列数,生成二维单位tensor

torch.rand(*size)

从 (0, 1) 之间,进行均匀分布采样,生成指定size 的tensor

torch.randn(*size)

从标准正态分布中采样,生成指定size 的tensor

torch.ones(*size)

按照指定 size,生成 值全为1 的 tensor

torch.zeros(*size)

按照指定 size,生成 值全为0 的 tensor

torch.ones_like(t)

返回尺寸与 t 相同的,值全为1 的 tensor

torch.zeros_like(t)

返回尺寸与 t 相同的,值全为0 的 tensor

torch.arange(start, end, step)

在区间[start, end) 上,每间隔 step 生成一个序列张量

torch.linspace(start, end, steps)

从 start 到 end,均匀切分成 steps 份

torch.from_Numpy(ndarray)

根据 ndarray 生成 tensor

  你可以将如下生成的 tensor,逐个打印,进行观察

import numpy as np
import torcha = torch.Tensor(2, 3)
b = torch.tensor([[1, 2, 3], [4, 5, 6]])c = torch.eye(3, 3)d = torch.rand(2, 3)
e = torch.randn(2, 3)f = torch.ones(3, 2)
g = torch.zeros(2, 3)
h = torch.ones_like(b)
i = torch.zeros_like(b)j = torch.linspace(1, 10, 4)
k = torch.arange(1, 5, 2)l = np.arange(1, 5)
m = torch.from_numpy(l)

2、查看 tensor 的形状

函数

作用

tensor.numel()

统计 tensor 元素的个数

tensor.size()

获取 tensor的尺寸,tensor.size() 是一个方法

tensor.shape

获取 tensor的尺寸,tensor.shape 是一个属性

import torcha = torch.tensor([[1, 2, 3], [4, 5, 6]])
print(a.numel())
print(a.size())
print(a.shape)

 


3、修改 tensor 形状

函数

作用

tensor.view(*size)

修改 tensor 的尺寸,返回的对象 与 源tensor 共享内存(修改一个,另一个也会被修改)

tensor.resize(*size)

修改 tensor 的尺寸,类似于view,但在size 超出时会重新分配内存空间

tensor.reshape(*size)

修改 tensor 的尺寸,返回的对象是一个新生成的tensor,且不要求源tensor 是连续的

tensor.flatten()

将张量扁平化为一维张量

torch.unsqueeze(dim)

在指定维度增加一个 “1”

torch.squeeze(dim)

在指定维度删除一个 “1”

tensor.transpose(dim0, dim1)

交换 dim0 和 dim1 指定的两个维度,返回一个新的张量而不修改原始张量

tensor.permute(dims)

按照 dims 指定的顺序重新排列张量的维度,返回一个新的张量而不修改原始张量

import torcha = torch.tensor([[1, 2, 3], [4, 5, 6]])print(a.view(3, 2))
print(a.resize(3, 2))
print(a.reshape(3, 2))
print(a.flatten())

import torcha = torch.tensor([[[1, 2, 3], [4, 5, 6]]])
print(a.shape)b = torch.unsqueeze(a, 0)
print(b.shape)c = torch.squeeze(b, 0)
print(c.shape)

 

import torcha = torch.tensor([[1, 2, 3], [4, 5, 6]])
b = a.transpose(dim0=0, dim1=1)
print(a.shape)
print(b.shape)c = torch.tensor([[[1, 2, 2], [3, 4, 3]]])
d = c.permute(1, 2, 0)
print(c.shape)
print(d.shape)


4、按条件筛选

函数

作用

torch.index_select(input, dim, index)

从输入张量中按索引选择某些元素

torch.nonzero(input)

获取张量中非零元素的索引

torch.masked_select(input, masked)

根据掩码(mask)从输入张量中选择元素

torch.gather(input, dim, index)

在指定维度上根据索引从输入张量中选择元素

torch.scatter(input, dim, index, src)

在指定维度(dim)上根据指定的索引(index),将源张量(src)的值散射到目标张量(input)中

 1)index_select

torch.index_select(input, dim, index) : 从输入张量中按索引选择某些元素,并返回一个新的张量

import torchtensor = torch.tensor([[1, 2, 3],[4, 5, 6],[7, 8, 9]])# 创建一个要选择的索引张量
indices = torch.tensor([0, 2])# 在第0维上使用index_select选择索引为0和2的行
selected_rows = torch.index_select(tensor, 0, indices)print("Selected rows:\n", selected_rows)

2)nonzero

torch.nonzero(input) : 获取张量中非零元素的索引

import torchtensor = torch.tensor([[0, 1, 0],[2, 0, 3],[0, 4, 0]])# 获取非零元素的索引
nonzero_indices = torch.nonzero(tensor)
print("Non-zero indices:\n", nonzero_indices)

 

3)masked_select

torch.masked_select(input, masked) : 根据掩码(mask)从输入张量中选择元素

import torch# 创建一个示例张量
input_tensor = torch.tensor([[1, 2, 3],[4, 5, 6],[7, 8, 9]])# 创建一个掩码张量
mask_tensor = torch.tensor([[0, 1, 0],[1, 0, 1],[0, 1, 0]], dtype=torch.bool)# 使用掩码选择张量中的元素
selected_tensor = torch.masked_select(input_tensor, mask_tensor)
print("Selected tensor:\n", selected_tensor)

4)gather

torch.gather(input, dim, index) : 在指定维度上根据索引从输入张量中选择元素。若 dim=n :

  • 要求除了第n个维度,input_tensor 和 index_tensor 其他维度数量一致

  • 在第n个维度上,通过 index_tensor 指定的索引,从 input_tensor 中取出对应位置的元素。

import torch# 创建一个示例张量
input_tensor = torch.tensor([[1, 2, 3],[4, 5, 6],[7, 8, 9]])# 创建一个示例索引张量
index_tensor = torch.tensor([[0, 2],[1, 0],[2, 1]])# 在第1维度上使用索引张量收集值
gathered_tensor = torch.gather(input_tensor, 1, index_tensor)print("Gathered tensor:\n", gathered_tensor)

 

5)scatter

torch.scatter(input, dim, index, src) :在指定维度(dim)上根据指定的索引(index),将源张量(src)的值放到目标张量(input)中

  • src 的形状 和 index的形状 必须保持一致,否则会报错

import torch# 创建一个示例目标张量
input_tensor = torch.zeros((4, 4), dtype=torch.int32)# 创建一个示例索引张量
index_tensor = torch.tensor([[0, 1],[2, 3]], dtype=torch.long)# 创建一个示例源张量
src_tensor = torch.tensor([[1, 2],[3, 4]], dtype=torch.int32)# 在第1维度上使用索引张量散射值
scattered_tensor = torch.scatter(input_tensor, 1, index_tensor, src_tensor)
print("Scattered tensor:\n", scattered_tensor)

 

No. 1

  • src_tensor 第0行第0列的值为“1”

  • index_tensor 第0行第0列的值为“0”, dim=1 表示 “0” 是列索引

  • 将 “1” 放到 input_tensor 中,对应行第“0”列的位置上

No. 2

  • src_tensor 第0行第1列的值为“2”,

  • index_tensor 第0行第1列的值为“1”,dim=1 表示 “1” 是列索引

  • 将 “2” 放到 input_tensor 中,对应行第“1”列的位置上

No. 3

  • src_tensor 第1行第0列的值为“3”,

  • index_tensor 第1行第0列的值为“2”,dim=1 表示 “2” 是列索引

  • 将 “3” 放到 input_tensor 中,对应行第“2”列的位置上

No. 4

  • src_tensor 第1行第1列的值为“4”,

  • index_tensor 第1行第1列的值为“3”,dim=1 表示 “3” 是列索引

  • 将 “4” 放到 input_tensor 中,对应行第“3”列的位置上


5、运算操作

函数

作用

torch.abs()

取绝对值

torch.add()

相加

torch.addcdiv(input, tensor1, tensor2, value)

result =input + value * tensor1 / tensor2

torch.addcmul(input, tensor1, tensor2, value)

result =input + value * tensor1 * tensor2

torch.ceil()

向上取整

torch.floor()

向下取整

torch.clamp(input, min, max)

对张量的元素进行截断操作,将超出指定范围的元素限制在指定范围内

torch.exp() / torch.log() / torch.pow

指数 / 对数 / 幂

torch.mul()

逐元素乘法,效果和 * 一样

torch.neg()

取反

torch.sqrt()

开根号

torch.sign()

取符号

 1)abs

import torchx = torch.arange(-5, 5)
y = torch.abs(x)
print(y)

2)add

import torchx = torch.arange(2, 5)
y = torch.arange(4, 7)
z = torch.add(x, y)
print(z)

 

3)addcdiv

  torch.addcdiv(input, tensor1, tensor2, value)

result =input + value * tensor1 / tensor2

import torcht = torch.randn(1, 3)
t1 = torch.randn(3, 1)
t2 = torch.randn(1, 3)a = t + 0.1 *(t1 / t2)
print(a)b = torch.addcdiv(t, t1, t2, value=0.1)
print(b)

 

4)addcmul

torch.addcmul(input, tensor1, tensor2, value)

result =input + value * tensor1 * tensor2

import torcht = torch.randn(1, 3)
t1 = torch.randn(3, 1)
t2 = torch.randn(1, 3)a = t + 0.1 * t1 * t2
print(a)b = torch.addcmul(t, t1, t2, value=0.1)
print(b)

 

5)ceil、floor

  • torch.ceil(input) :向上取整

  • torch.floor(input) :向下取整

import torchtorch.manual_seed(8)
x = torch.randn(3) * 10
y = torch.ceil(x)
z = torch.floor(x)
print(x)  
print(y) 
print(z)

6)clamp

  将张量元素大小限制在指定区间范围内

import torchx = torch.arange(1, 8)
y = torch.clamp(x, 2, 5)
print(y)

 

7)exp、log、pow

import torchtorch.manual_seed(8)
x = torch.arange(3)
print(x)
print(torch.exp(x))
print(torch.log(x))  # 以e为底
print(torch.pow(x, 3)) 

8)mul

  逐元素乘法,效果和 * 一样

import torcha = torch.tensor([[2, 2, 2],[2, 3, 4]])b = torch.tensor([[3, 3, 3],[4, 5, 6]])print(torch.mul(a,b))
print(a*b)

 

9)neg、sqrt、sign

  • torch.neg() 取反

  • torch.sqrt() 开根号

  • torch.sign() 取符号

import torcha = torch.tensor([[2, -2, 2], [2, -3, 4]])print(torch.neg(a)) print(torch.sqrt(a))print(torch.sign(a))


6、统计操作

函数

作用

torch.sum() / torch.prod()

求和 / 求积

torch.cumsum() / torch.cumprod()

在指定维度上进行累加 / 在指定维度上进行累乘

torch.mean()、torch.median()

均值 / 中位数

torch.std() / torch.var()

标准差 / 方差

torch.norm(t, p)

t 的 p阶范数

torch.dist(a, b, p)

a,b 之间的 p阶范数

1)sum、prod、cumsum、cumprod

import torcha = torch.linspace(0, 10, 6).view(2, 3)
print(a)b = a.sum(dim=0)
c = torch.cumsum(a, dim=0)
print('\n维度0上求和 与 累加')
print(b)
print(c)d = a.prod(dim=1)
e = torch.cumprod(a, dim=1)
print('\n维度0上求积 与 累积')
print(d)
print(e)

 

2)mean、median

import torcha = torch.tensor([[2., 2., 5.],[3., 3., 8.],[4., 4., 4.]])print('求均值')
print(torch.mean(a))
print(torch.mean(a, 0))
print(torch.mean(a, 1))print('\n求中位数')
print(torch.median(a))
print(torch.median(a, 0))
print(torch.median(a, 1))

3)std、var

import torch# 创建示例张量
a = torch.tensor([[1.0, 2.0],[3.0, 4.0]])# 计算张量的标准差
std_value = torch.std(a)
print("Standard deviation:", std_value)# 计算张量的方差
var_value = torch.var(a)
print("Variance:", var_value)

 

4)norm、dist

  • torch.norm(t, p) :t 的 p阶范数

  • torch.dist(a, b, p) :a,b 之间的 p阶范数

import torch# 创建示例张量
tensor1 = torch.tensor([1.0, 2.0, 3.0])
tensor2 = torch.tensor([4.0, 5.0, 6.0])# 使用 torch.norm() 计算张量的范数
norm_value = torch.norm(tensor1)
print("tensor1 的L2范数:", norm_value)# 使用 torch.dist() 计算两个张量的范数
dist_value = torch.dist(tensor1, tensor2)
print("tensor1 和 tensor2 之间的L2范数:", dist_value)


7、比较操作

函数

作用

torch.eq

比较 tensor 是否相等 (支持 broadcast)

torch.equal

比较 tensor 是否有相同的 shape 与 值

torch.gt / torch.lt

大于 / 小于 gt : great than ; lt : less than

torch.ge / torch.le

大于等于 / 小于等于 ge : greater than or equal to ; le : less than or equal to

torch.max / torch.min(t,axis)

最大值 / 最小值

torch.topk(t, k, axis)

在指定维度上(axis)取最高的 k个值

 1)eq、 equal

import torch# 示例张量
t = torch.tensor([[1, 2, 3],[4, 5, 6]])# 使用eq()比较张量中的元素是否等于2
result_eq = torch.eq(t, 2)
print("Result of eq():\n", result_eq)# 使用equal()比较两个张量是否相等
t1 = torch.tensor([[1, 2, 3],[4, 5, 6]])
t2 = torch.tensor([[1, 2, 3],[4, 5, 6]])
result_equal = torch.equal(t1, t2)
print("\nResult of equal():", result_equal)

2)gt、 lt、ge、 le

import torch# 示例张量
t = torch.tensor([[1, 2, 3],[4, 5, 6]])# 使用gt()比较张量中的元素是否大于3
result_gt = torch.gt(t, 3)
print("Result of gt():\n", result_gt)# 使用lt()比较张量中的元素是否小于3
result_lt = torch.lt(t, 3)
print("\nResult of lt():\n", result_lt)# 使用gt()比较张量中的元素是否大于等于3
result_ge = torch.ge(t, 3)
print("\nResult of ge():\n", result_ge)# 使用le()比较张量中的元素是否小于等于3
result_le = torch.le(t, 3)
print("\nResult of le():\n", result_le)

 

3)max、min

import torch# 示例张量
t = torch.tensor([[1, 2, 3],[4, 5, 6]])# 计算张量的最大值和最小值
max_value = torch.max(t)
min_value = torch.min(t)
print("Max value:", max_value)
print("Min value:", min_value)# 沿着指定维度计算张量的最大值和最小值
max_value_axis_0 = torch.max(t, axis=0)
min_value_axis_1 = torch.min(t, axis=1)
print("\n沿0维上的最大值:", max_value_axis_0.values)
print("沿0维上的最大值索引:", max_value_axis_0.indices)
print("沿1维上的最小值:", min_value_axis_1.values)
print("沿1维上的最小值索引:", min_value_axis_1.indices)

4)topk

import torch# 示例张量
t = torch.tensor([[1, 2, 3],[4, 5, 6]])# 沿着指定维度获取张量中最大的两个值及其索引
topk_values, topk_indices = torch.topk(t, k=2, dim=1)
print("沿维度1上的最大的2个值:\n", topk_values)
print("\n沿维度1上的最大的2个值的索引:\n", topk_indices)

 


8、矩阵操作

函数

作用

torch.dot(t1, t2)

计算 1维张量的内积或点积

torch.mul(t1, t2)

逐元素相乘

torch.mm(t1, t2) / torch.mv(t, v)

计算矩阵乘法 / 计算矩阵t与向量v 的乘法

bmm

含 batch 的 3D 矩阵乘法

svd

计算 t 的 SVD分解

 1)dot

  Torch的 dot 只能对两个 一维张量 进行点积运算,否则会报错;Numpy中的dot无此限制。

import torcha = torch.tensor([2, 3])
b = torch.tensor([3, 4])print(torch.dot(a, b))

import torcha = torch.tensor([[2, 3],[3, 4]])b = torch.tensor([[3, 4],[1, 2]])print(torch.dot(a, b))

2)mul

  • a 和 b 必须尺寸相同。

  • torch.mul(a, b) 和 a * b 效果一样

  • torch.mul(a, b) 是逐元素相乘,torch.mm(a, b) 是矩阵相乘

import torcha = torch.tensor([[2, 3],[3, 4]])b = torch.tensor([[3, 4],[1, 2]])print(torch.mul(a, b))
print(a * b)
print(torch.mm(a, b))

 

3)mm、mv

  • torch.mm(t1, t2) 是矩阵相乘, torch.mv(t, v) 矩阵与向量乘法

  • torch.mv(t, v) , 矩阵t为第一个参数,向量v为第二个参数,位置不能换,否则会报错

import torcha = torch.tensor([[1, 2, 3],[2, 3, 4]])b = torch.tensor([[1, 2],[1, 2],[3, 4]])c = torch.tensor([1, 2, 3])print(torch.mm(a, b))
print(torch.mv(a, c))

 

4)bmm 

import torchbatch1 = torch.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]], dtype=torch.float32)  # Shape: (2, 2, 2)
batch2 = torch.tensor([[[2, 0], [0, 2]], [[1, 0], [0, 1]]], dtype=torch.float32)  # Shape: (2, 2, 2)result = torch.bmm(batch1, batch2)
print("Result:\n", result)

5)svd

import torcha = torch.randn(2, 3)
print(torch.svd(a))

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/78110.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java面试题04】MySQL 篇

文章目录 一、前言🚀🚀🚀二、MySQL 篇:☀️☀️☀️1、MySQL 是如何实现事务的? 后序还在更新中~~~三、总结:🍓🍓🍓 一、前言🚀🚀🚀 ☀️ 你每一…

UDP/TCP协议知识及相关机制

一.UDP协议 UDP是一种无连接、不可靠、面向报文、全双工传输层的协议~ 1.无连接 : 知道对端的端口号和IP可以直接传输,不需要建立连接 2..不可靠:没有确认机制,没有重传机制,不知道数据包能否能正确到达对端&#xff0…

【AI面试准备】语言模型、语音、多模态等模型能力评估指标和能力边界

面试岗位提出这个要求:掌握语言模型、语音、多模态等模型能力评估指标和能力边界。 以下是针对语言模型、语音模型、多模态模型能力评估指标与能力边界的结构化总结,结合高频面试考点和实际应用场景: 目录 **一、语言模型(LLM)评估与边界**1. **核心评估指标**2. **能力边…

优雅关闭服务:深入理解 SIGINT / SIGTERM 信号处理机制

目录 为什么需要优雅关闭? 什么是 SIGINT 和 SIGTERM? 如何实现优雅关闭(以 C 为例) 示例代码(gRPC 服务 Boost 信号监听): 优雅关闭时的清理内容通常包括: 与 SIGKILL 的区别…

容器化-Docker-集群

一、Docker 集群基础概念​ 1、什么是 Docker 集群​ Docker 集群是由多个 Docker 主机组成的集合,这些主机通过网络连接在一起,共同管理和运行容器。在集群中,我们可以将容器服务均匀地分布到各个节点上,实现负载均衡和资源的高效利用。Docker 集群的核心组件包括管理器…

关于kafka

1.为什么需要消息队列 举个经典的例子。 你是一个网购达人,经常在网上购物。快递小哥到了你的小区后,立刻给你打电话说:“你的快递到了,请马上来取。” 但你是一个合格的牛马,在上班,不方便取快递&#…

微服务即时通信系统(十二)---入口网关子服务

目录 功能设计 模块划分 业务接口/功能示意图 服务实现流程 网关HTTP接口 网关WebSocket接口 总体流程 服务代码实现 客户端长连接管理封装(connectionManage.hpp) proto文件的编写 身份鉴权proto 事件通知proto 各项请求的URL的确定 服务端完成入口网关服务类…

存储器层次结构:理解计算机记忆的金字塔

存储器层次结构:理解计算机记忆的金字塔 在计算机系统中,“速度”与“成本”常常处于对立面。为了在速度与成本之间取得平衡,计算机体系结构采用了一种名为“存储器层次结构(Memory Hierarchy)”的设计思想。本文将通…

HTTP 错误 500.19 - Internal Server Error

1.HTTP 错误 500.19 - Internal Server Error NetCore项目托管到IIS后,报错如下: 原因是因为IIS中没有安装AspNetCoreModuleV2导致的, 1.打开IIS 2.选中服务器根节点,找到模块,双击进入,确认模块中是否存…

【c++】【STL】stack详解

目录 stack类的作用什么是容器适配器stack的接口构造函数emptysizetoppushpopswap关系运算符重载 stack类的实现 stack类的作用 stack是stl库提供的一种容器适配器,也就是我们数据结构中学到的栈,是非常常用的数据结构,特点是遵循LIFO&#…

K8s学习与实践

一、Kubernetes 核心原理 1. Kubernetes 设计哲学 Kubernetes(k8s)是一个开源的容器编排平台,旨在自动化容器化应用的部署、扩展和管理。其核心设计围绕以下目标: 声明式配置:用户描述期望状态(如 YAML …

Umi-OCR项目(1)

最近接触到了一个项目,我在想能不能做出点东西出来。 目标:识别一张带表格的图片,要求非表格内容和表格内容都要识别得很好,并且可视化输出为word文档。 下面是第一步的测试代码,测试是否能够调用ocr能力。 import re…

Mioty|采用报文分割(Telegram Splitting)以提高抗干扰能力的无线通信技术【无线通信小百科】

1、什么是Mioty 在物联网(IoT)快速发展的背景下,低功耗广域网(LPWAN)技术成为连接海量设备的关键。LPWAN具有低功耗、低成本、广覆盖和强抗干扰能力等特点,使其特别适用于大规模、远距离、低数据速率的IoT…

TCP三次握手、四次挥手+多线程并发处理

目录 一、三次握手建立连接 1.1 标记位 1.2 三次握手的过程 二、四次挥手断开连接 三、模拟服务器和客户端收发数据 四、多线程并发处理 五、TCP粘包问题 5.1 什么是TCP粘包? 5.2 TCP粘包会有什么问题? 5.3 TCP粘包的解决方法? 一、三…

使用HunyuanVideo搭建文本生视频大模型

1.摘要 HunyuanVideo是一个全新的开源视频基础模型,其视频生成性能堪比领先的闭源模型,甚至超越它们。我们采用了多项模型学习的关键技术,通过有效的模型架构和数据集扩展策略,我们成功训练了一个拥有超过 130 亿个参数的视频生成…

LabVIEW圆锥滚子视觉检测系统

基于LabVIEW平台的视觉检测系统提高圆锥滚子内组件的生产质量和效率。通过集成高分辨率摄像头和先进的图像处理算法,系统能够自动识别和分类产品缺陷,从而减少人工检查需求,提高检测的准确性和速度。 ​​ ​ 项目背景 随着制造业对产品质…

mac 基于Docker安装minio服务器

在 macOS 上基于 Docker 安装 MinIO 是一个高效且灵活的方案,尤其适合本地开发或测试环境。以下是详细的安装与配置步骤,结合了最佳实践和常见问题的解决方案: 一、安装 Docker Desktop 下载安装包 访问 Docker 官网,下载适用于 …

EchoMimicV2 部署记录

在这里插入代码片# 虚拟环境配置 pip install pip -U pip install torch2.5.1 torchvision0.20.1 torchaudio2.5.1 xformers0.0.28.post3 --index-url https://download.pytorch.org/whl/cu124 pip install torchao --index-url https://download.pytorch.org/whl/nightly/cu1…

数据升降级:医疗数据的“时空穿梭“系统工程(分析与架构篇)

一、核心挑战与量化分析 1. 版本演化困境的深度解析 (1) 格式断层的结构化危机 数据转换黑洞:某医疗信息平台(2021-2023)统计显示: 数据类型CDA R1→R2转换失败率R2→FHIR转换失败率关键失败点诊断记录28.4%19.7%ICD编码版本冲突(18.7%)用药记录15.2%12.3%剂量单位标准化…

个人开发免费好用

聊一聊 现在输入法非常多,有时候都不知道哪个更好用。 其实,只有多尝试,才能找到适合自己的。 今天给大家分享一款输入法,用起来比较顺手,大家可以试试。 软件介绍 BL输入法 这是一款绿色纯净,安全放心…