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

从原理到实践 | Pytorch tensor 张量花式操作

文章目录

  • 1.张量形状与维度
    • 1.1标量(0维张量):
    • 1.2 向量(1维张量):
    • 1.3矩阵(2维张量):
    • 1.4高维张量:
  • 2. 张量其他创建方式
    • 2.1 创建全零或全一张量:
    • 2.2 创建随机张量:
    • 2.3 创建单位矩阵:
    • 2.4 创建序列张量:
  • 3. 张量元素
    • 3.1 查看元素类型
    • 3.2 张量元素类型转换
  • 4. 张量运算
    • 4.1 张量的基本运算
    • p.2 张量间乘法点积运算
    • 4.3 张量元素运算函数
      • 4.3.1逐元素运算函数:
      • 4.3.2 统计汇总运算函数
  • 5.张量的拼接 切片 扩展 重塑 改变形状等操作
    • 5.1 张量拼接(Concatenation):
    • 5.2 张量切片(Slicing):
    • 5.3 张量转置(Transpose):
    • 5.4 张量形状重塑:
  • 6.广播机制
    • 6.1 张量+标量
    • 6.2 张量+张量

Tensor(张量)是一种多维数组(通常是数字)数据类型,是深度学习和机器学习中最基本的数据结构之一。

PyTorch提供了一种直观的方式来创建和操作张量,而且它还支持GPU加速,这对于深度学习任务非常重要。我们可以使用PyTorch来定义神经网络模型、进行前向传播和反向传播,以及许多其他深度学习任务,因而了解张量是了解这些任务的基础。

1.张量形状与维度

维度(Rank):张量的维度也称为秩(rank),表示张量中轴(或维度)的数量。标量是0维张量,向量是1维张量,矩阵是2维张量,以此类推。

我们使用**.shape** 查看形状,.ndim属性查看维度

当使用PyTorch库时,我们可以轻松地创建和操作张量。下面是使用PyTorch创建不同秩的张量的示例代码:

1.1标量(0维张量):

import torchscalar = torch.tensor(5)  # 创建一个标量
print("Scalar:", scalar)
print("Scalar的秩(Rank):", scalar.ndim)  # 输出0,表示秩为0
print("Scalar的形状", scalar.shape) #输出torch.Size([])  #输出torch.Size([])此时形状向量输出为空

1.2 向量(1维张量):

import torchvector = torch.tensor([1, 2, 3, 4])  # 创建一个向量
print("Vector:", vector)
print("Vector的秩(Rank):", vector.ndim ) # 输出1,表示秩为1
print("vector的形状", vector.shape) #输出torch.Size([4])

1.3矩阵(2维张量):

import torchmatrix = torch.tensor([[1, 2, 3], [4, 5, 6]])  # 创建一个2x3的矩阵
print("Matrix:")
print(matrix)
print("Matrix的秩(Rank):", matrix.ndim  # 输出2,表示秩为2
print("Matrix的形状:", matrix.shape  # 输出torch.Size([2,3]) 2x3的矩阵

1.4高维张量:

import torch
tensor_3d = torch.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])  # 创建一个2x2x2的3维张量
print("3D Tensor:")
print(tensor_3d)
print("3D Tensor的秩(Rank):", tensor_3d.ndim)  # 输出3,表示秩为3
print("3D Tensor的形状:", tensor_3d.shape ) # 输出torch.Size([2,2,2]) 2x2x2的3维张量

2. 张量其他创建方式

以上我们实际上是通过torch.tensor函数把列表转换为tensor张量

除此之外,还有一些其他torch内置函数的创建方式

2.1 创建全零或全一张量:

# 创建特定形状的全零张量
zeros_tensor = torch.zeros(3, 2) #创建形状(3,2)的全零张量# 创建特定形状的全一张量
ones_tensor = torch.ones(2, 3)#创建形状(2,3)的全一张量

2.2 创建随机张量:

# 创建特定形状的随机均匀分布的张量 每个元素都会随机生成,取值范围是大于等于0且小于1的浮点数。
uniform_random = torch.rand(2, 2) #形状(2,2)# 创建随机正态分布的张量
normal_random = torch.randn(3, 3)  #形状(3,3)

2.3 创建单位矩阵:

# 创建单位矩阵
identity_matrix = torch.eye(4)

输出

tensor([[1., 0., 0., 0.],
[0., 1., 0., 0.],
[0., 0., 1., 0.],
[0., 0., 0., 1.]])

2.4 创建序列张量:

# 创建从0到4的张量
sequence_tensor = torch.arange(5)# 创建从2到10的张量,步长为2
sequence_with_step = torch.arange(2, 11, step=2)

3. 张量元素

张量中的每个值称为元素。根据张量的维度和形状,可以有不同数量的元素。例如,一个形状为(3, 4)的张量将包含12个元素。

每个元素可以有不同的类型

张量可以包含不同的数据类型,如整数、浮点数、布尔值等。常见的数据类型包括int32float32bool

3.1 查看元素类型

使用 .dtype 属性可以查看张量的数据类型。例如:

pythonCopy codeimport torch# 创建一个张量
tensor = torch.tensor([1, 2, 3, 4], dtype=torch.float32)# 查看张量的数据类型
print(tensor.dtype)

输出将显示张量的数据类型,例如 torch.float32

注意,python其他数据类型查看是通过type函数(),注意区分,距离如下

# 定义不同类型的变量
integer_variable = 42
float_variable = 3.14
string_variable = "Hello, World!"
list_variable = [1, 2, 3]
dictionary_variable = {"name": "John", "age": 30}# 使用 type() 函数查看数据类型
print(type(integer_variable))  # <class 'int'>
print(type(float_variable))    # <class 'float'>
print(type(string_variable))   # <class 'str'>
print(type(list_variable))     # <class 'list'>
print(type(dictionary_variable))  # <class 'dict'>

3.2 张量元素类型转换

通过to函数() 或者用type()函数

注意这里的type()函数是tensor张量自己带的,不是上面讲到3.1讲到的python内的type函数

import torch
# 创建一个整数类型的张量
int_tensor = torch.tensor([1, 2, 3, 4],dtype=torch.int32)# 将整数类型的张量转换为浮点数类型  或者 float_tensor = int_tensor.type(torch.float32)
float_tensor = int_tensor.to(torch.float32)# 查看新的张量的数据类型
print(float_tensor.dtype)

输出为 torch.float32

注意 执行to函数之后必须进行赋值操作,否则该操作就丢失了,查看下面的代码

import torch
# 创建一个整数类型的张量
int_tensor = torch.tensor([1, 2, 3, 4],dtype=torch.int32)
# 将整数类型的张量转换为浮点数类型
int_tensor.to(torch.float32)
# 查看新的张量的数据类型
print(int_tensor.dtype)

最开始我觉得会输出torch.float32 实际输出torch.int32

4. 张量运算

4.1 张量的基本运算

  • 加法和减法:可以使用 +- 运算符执行张量的逐元素加法和减法。
  • 乘法和除法:可以使用 */ 运算符执行逐元素的乘法和除法。
  • 幂运算:使用 ** 运算符进行幂运算。
  • 取负值:使用 - 运算符取张量的负值。
import torch# 创建两个示例张量
tensor1 = torch.tensor([1.0, 2.0, 3.0])
tensor2 = torch.tensor([4.0, 5.0, 6.0])# 加法和减法
result_addition = tensor1 + tensor2  # 逐元素加法
result_subtraction = tensor1 - tensor2  # 逐元素减法# 乘法和除法
result_multiplication = tensor1 * tensor2  # 逐元素乘法
result_division = tensor1 / tensor2  # 逐元素除法# 幂运算
exponent = 2
result_power = tensor1 ** exponent  # 每个元素求平方# 取负值
result_negation = -tensor1  # 每个元素取负值print("Addition:", result_addition)
print("Subtraction:", result_subtraction)
print("Multiplication:", result_multiplication)
print("Division:", result_division)
print("Power:", result_power)
print("Negation:", result_negation)

输出

p.2 张量间乘法点积运算

  1. 矩阵相乘

    使用 torch.matmul() 函数或 @ 运算符 或**torch.mm()** 可以执行两个张量(矩阵)的矩阵相乘。矩阵相乘要求左边矩阵的列数等于右边矩阵的行数

    import torch# 创建两个示例矩阵
    matrix1 = torch.tensor([[1, 2], [3, 4]])
    matrix2 = torch.tensor([[5, 6], [7, 8]])# 矩阵相乘 matmul
    result_matrix_mul_1 = torch.matmul(matrix1, matrix2)
    # 或者使用 @ 运算符
    result_matrix_mul_2 = matrix1 @ matrix2
    # 矩阵相乘 mm
    result_matrix_mul_3=torch.mm(matrix1, matrix2)print("Matrix Multiplication:")
    print(result_matrix_mul_1)
    print(result_matrix_mul_2)
    print(result_matrix_mul_3)
    

    输出将是两个矩阵相乘的结果

    Matrix Multiplication:
    tensor([[19, 22],
    [43, 50]])
    tensor([[19, 22],
    [43, 50]])
    tensor([[19, 22],
    [43, 50]])

  2. 批量矩阵相乘

    使用 torch.matmul() 函数和**@运算符可以执行两个张量的批量矩阵相乘。这对于同时处理多个矩阵非常有用,但要求最后两个维度必须是矩阵的维度**。而mm只能用于单个矩阵乘法

    import torch# 创建两个批量矩阵(3个2x2矩阵)
    batch_matrix1 = torch.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]], [[9, 10], [11, 12]]])
    batch_matrix2 = torch.tensor([[[2, 0], [1, 2]], [[-1, -2], [-3, -4]], [[0, 1], [-1, 0]]])# 执行批量矩阵相乘
    result_batch_matrix_mul_1 = batch_matrix1 @ batch_matrix2
    result_batch_matrix_mul_2 =torch.matmul(batch_matrix1,batch_matrix2)
    # 或者使用 @ 运算符
    # result_batch_matrix_mul = batch_matrix1 @ batch_matrix2print("Batch Matrix Multiplication:")
    print(result_batch_matrix_mul_1)
    print(result_batch_matrix_mul_2)

    输出将是批量矩阵相乘的结果

    输出

    Batch Matrix Multiplication:
    tensor([[[ 4, 4],
    [ 10, 8]],

    ​ [[-23, -34],
    ​ [-31, -46]],

       	 [[-10,   9],[-12,  11]]])
    

    tensor([[[ 4, 4],
    [ 10, 8]],

         [[-23, -34],[-31, -46]],
    

    ​ [[-10, 9],
    ​ [-12, 11]]])

  3. 点积

    点积是两个向量的内积,也可以视为两个矩阵的逐元素乘法后的和。在 PyTorch 中,可以使用 torch.dot() 函数来计算两个一维张量的点积。

    import torch# 创建两个一维示例张量
    vector1 = torch.tensor([1, 2, 3])
    vector2 = torch.tensor([4, 5, 6])# 计算点积
    dot_product = torch.dot(vector1, vector2)print("Dot Product:")
    print(dot_product)
    

    输出将是两个向量的点积结果

Dot Product:
tensor(32)

4.3 张量元素运算函数

tensor张量还会自带很多的运算函数,方便我们的操作

4.3.1逐元素运算函数:

这些运算将分别应用于张量的每个元素,结果将生成一个与原始张量相同形状的新张量。

  • torch.abs(tensor):计算张量中每个元素的绝对值。
  • torch.sqrt(tensor):计算张量中每个元素的平方根。
  • torch.exp(tensor):计算张量中每个元素的指数值。
  • torch.log(tensor):计算张量中每个元素的自然对数。

4.3.2 统计汇总运算函数

这些运算将返回张量的单个标量值,通常用于统计和汇总。

  • torch.sum(tensor):计算张量中所有元素的和。
  • torch.mean(tensor):计算张量中所有元素的平均值。
  • torch.max(tensor)torch.min(tensor):计算张量中的最大值和最小值。
  • torch.argmax(tensor)torch.argmin(tensor):返回张量中最大值和最小值的索引。
  • torch.unique(tensor):返回张量中的唯一元素。
  • torch.histc(tensor, bins=10, min=0, max=1):计算张量的直方图。

5.张量的拼接 切片 扩展 重塑 改变形状等操作

PyTorch 提供了一系列用于处理和操作张量的运算,包括拼接、切片、转置、扩展和重塑等。以下是这些运算的详细介绍:

5.1 张量拼接(Concatenation):

  • torch.cat(tensors, dim=0):将多个张量沿指定维度 dim 进行拼接,生成一个新的张量。这在将多个张量连接在一起时非常有用。

    import torch# 创建两个示例张量
    tensor1 = torch.tensor([[1, 2,3], [4, 5,6]])  #(2×3)
    tensor2 = torch.tensor([[7, 8,9], [10, 11,12]]) #(2×3)# 沿行维度进行拼接
    result_concatenation_row = torch.cat((tensor1, tensor2), dim=0) #行维度对应相加,最后拼接后的形状(4×3)
    result_concatenation_column=torch.cat((tensor1, tensor2), dim=1)#列维度对应相加,最后拼接后的形状(2×6)print("Concatenation:")
    print(result_concatenation_row)
    print(result_concatenation_column)

Concatenation:
tensor([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12]])
tensor([[ 1, 2, 3, 7, 8, 9],
[ 4, 5, 6, 10, 11, 12]])

5.2 张量切片(Slicing):

  • 使用索引和切片运算符 [] 对张量进行切片。可以指定要提取的元素的索引或范围。这对于获取部分数据非常有用。

    import torch# 创建一个示例张量
    tensor = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])# 提取特定元素
    element = tensor[0, 1]  # 获取第一行第二列的元素# 提取特定行或列
    row = tensor[1, :]  # 获取第二行的所有元素
    column = tensor[:, 2]  # 获取第三列的所有元素print("Element:", element)
    print("Row:", row)
    print("Column:", column)
    

Element: tensor(2)
Row: tensor([4, 5, 6])
Column: tensor([3, 6, 9])

5.3 张量转置(Transpose):

  • torch.transpose(tensor, dim0, dim1):将张量的指定维度进行转置,生成一个新的张量。这对于调整张量的维度顺序非常有用。

    import torch# 创建一个示例张量
    tensor = torch.tensor([[1, 2, 3], [4, 5, 6]])# 转置张量
    transposed_tensor = torch.transpose(tensor, dim0=0, dim1=1)  # 交换行和列print("Transposed Tensor:")
    print(transposed_tensor)
    

输出

Transposed Tensor:
tensor([[1, 4],
[2, 5],
[3, 6]])

5.4 张量形状重塑:

  • tensor.view(new_shape)或者函数tensor.reshape(new_shape)将张量的形状重塑为新的形状,生成一个新的张量。这对于改变张量的形状非常有用,但要确保新形状与原始形状兼容。

    pythonCopy codeimport torch# 创建一个示例张量
    tensor = torch.tensor([[1, 2, 3], [4, 5, 6]])# 重塑张量的形状
    reshaped_tensor = tensor.view(3, 2)  # 将2x3矩阵重塑为3x2矩阵print("Reshaped Tensor:")
    print(reshaped_tensor)
    

这些张量操作非常有用,可用于处理和操作 PyTorch 张量,适应不同的任务和需求。请根据您的具体情况选择适当的操作。

6.广播机制

广播(Broadcasting)是一种在 PyTorch 中执行元素级运算的机制,它允许在不同形状的张量之间进行运算,而无需显式地扩展(重复复制)其中一个张量。广播使得在不同形状的张量上执行操作更加方便,因为它自动调整张量的形状,以使其兼容。

6.1 张量+标量

import torch# 创建示例张量
tensor = torch.tensor([[1, 2], [3, 4]])# 使用广播将标量加到矩阵的每个元素上
scalar = 2
result_broadcasting = tensor + scalarprint("Broadcasting:")
print(result_broadcasting)

输出

Broadcasting:
tensor([[3, 4],
[5, 6]])

6.2 张量+张量

广播规则如下:

不要求两个张量维度数相等,但要求从右向左逐一比较张量的维度(直到维度低的向量比较完毕)满足以下两个条件之一即可

(1)两个张量该维度相等

(2)其中一个张量该维度是1

如果在某一维度的比较上两者都不满足,则会引发广播错误。

tensor_1=torch.ones(2,3,4)  #2*3*4tensor_2=torch.ones(3,1)    #3*1tensor=tensor_2+tensor_1
print(tensor)

如上,从右向左 ,第一维(4和1 )虽然不相等,但tensor_2为1 满足条件(2)

​ 继续从右向左,第二维(3,3 )相等,满足条件(1)

​ 此时低维向量比较完毕,所以上述两者可以广播

tensor_1=torch.ones(2,3,3)#2*3*2tensor_2=torch.ones(2,1)  #2*3tensor=tensor_2+tensor_1
print(tensor)

而这个例子,从右向左 ,第一维(3和1 )虽然不相等,但tensor_2为1 满足条件(2)

​ 继续从右向左,第二维(3,2 )不相等,不满足条件(1),也不满足条件(2),引发广播失败

相关文章:

从原理到实践 | Pytorch tensor 张量花式操作

文章目录 1.张量形状与维度1.1标量&#xff08;0维张量&#xff09;&#xff1a;1.2 向量&#xff08;1维张量&#xff09;&#xff1a;1.3矩阵&#xff08;2维张量&#xff09;&#xff1a;1.4高维张量&#xff1a; 2. 张量其他创建方式2.1 创建全零或全一张量&#xff1a;2.2…...

无涯教程-JavaScript - TRANSPOSE函数

描述 TRANSPOSE函数将单元格的垂直范围作为水平范围返回,反之亦然。必须将TRANSPOSE函数作为数组公式输入,该范围必须具有与行范围和列范围相同的行和列数。 您可以使用TRANSPOSE在工作表上移动数组或范围的垂直和水平方向。 语法 TRANSPOSE (array)键入函数后,按CTRL SHI…...

Webserver项目解析

一.webserver的组成部分 Buffer类 用于存储需要读写的数据 Channel类 存储文件描述符和相应的事件&#xff0c;当发生事件时&#xff0c;调用对应的回调函数 ChannelMap类 Channel数组&#xff0c;用于保存一系列的Channel Dispatcher 监听器&#xff0c;可以设置为epo…...

Spring Cloud 篇

1、什么是SpringCloud &#xff1f; Spring Cloud 流应用程序启动器是基于 Spring Boot 的 Spring 集成应用程序&#xff0c;提供与外部系统的集成。Spring cloud Task&#xff0c;一个生命周期短暂的微服务框架&#xff0c;用于快速构建执行有限数据处理的应用程序。 2、什么…...

vim,emacs,verilog-mode这几个到底是啥关系?

vim&#xff1a;不多说了被各类coder誉为地表最强最好用的编辑器&#xff1b;gvim&#xff0c;gui vim的意思&#xff1b; emacs&#xff1a;也是一个编辑器&#xff0c;类似vscode&#xff1b; vim在使用的时候为了增强其功能&#xff0c;有好多好多插件&#xff0c;都是以.…...

解决npm run build 打包出现XXXX.js as it exceeds the max of 500KB.

问题描述&#xff1a; npm run build 时出现下面的问题&#xff1a; Note: The code generator has deoptimised the styling of D:\base\node_modules\_element-ui2.15.12element-ui\lib\element-ui.common.js as it exceeds the max of 500KB.在项目的根目录加粗样式下找到 …...

Java 抖音小程序SDK

抖音小程序SDK&#xff0c;抖音SDK 码云地址&#xff1a;dy-open-sdk: 字节跳动&#xff0c;抖音小程序sdk...

Vue.js的服务器端渲染(SSR):为什么和如何

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…...

Gin 打包vue或react项目输出文件到程序二进制文件

Gin 打包vue或react项目输出文件到程序二进制文件 背景解决方案1. 示例目录结构2. 有如下问题要解决:3. 方案探索 效果 背景 前后端分离已成为行业主流&#xff0c;vue或react等项目生成的文件独立在一个单独目录&#xff0c;与后端项目无关。 实际部署中&#xff0c;通常前面套…...

深度解析shell脚本的命令的原理之pwd

pwd是Print Working Directory的缩写&#xff0c;是一个Unix和Linux shell命令&#xff0c;用于打印当前工作目录的绝对路径。以下是对这个命令的深度解析&#xff1a; 获取当前工作目录&#xff1a;pwd命令通过调用操作系统提供的getcwd&#xff08;或相应的&#xff09;系统调…...

Kafka3.0.0版本——消费者(分区的分配以及再平衡)

目录 一、分区的分配以及再平衡1.1、消费者分区及消费者组的概述1.2、如何确定哪个consumer来消费哪个partition的数据1.3、消费者分区分配策略 一、分区的分配以及再平衡 1.1、消费者分区及消费者组的概述 一个consumer group中有多个consumer组成&#xff0c;一个 topic有多…...

Kotlin文件遍历FileTreeWalk filter

Kotlin文件遍历FileTreeWalk filter import java.io.Filefun main(args: Array<String>) {val filePath "."val file File(filePath)val fileTree: FileTreeWalk file.walk()fileTree//.maxDepth(1) //遍历层级1&#xff0c;不检查子目录.filter {it.isFile…...

Activiti兼容达梦数据库

1. 自定义类继承SpringProcessEngineConfiguration类&#xff0c;重写initDatabaseType方法。 package com.ydtf.cbda.module.cbdacim.improcess.config;import org.activiti.engine.ActivitiException; import org.activiti.spring.SpringProcessEngineConfiguration; import…...

shell 流程控制

流程控制 if条件判断 可以使用if来实现多路跳转&#xff0c;条件通常使用test命令 #if语句的语法if condition1then command1elif condition2 then command2else commandNfi 如果then需要和if放在同一行的话&#xff0c;使用;分隔 fi用来结束if语句&#xff0c;相当于…...

【C++】红黑树插入操作实现以及验证红黑树是否正确

文章目录 前言一、红黑树的插入操作1.红黑树结点的定义2.红黑树的插入1.uncle存在且为红2.uncle不存在3.uncle存在且为黑 3.完整代码 二、是否为红黑树的验证1.IsBlance函数2.CheckColor函数 三、红黑树与AVL树的比较 前言 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在…...

学信息系统项目管理师第4版系列07_项目管理知识体系

1. 项目管理原则 1.1. 勤勉、尊重和关心他人 1.1.1. 关键点 1.1.1.1. 关注组织内部和外部的职责 1.1.1.2. 坚持诚信、关心、可信、合规原则 1.1.1.3. 秉持整体观 1.1.2. 职责 1.1.2.1. 诚信 1.1.2.2. 关心 1.1.2.3. 可信 1.1.2.4. 合规 1.2. 营造协作的项目管理团队…...

Leetcode 2851. String Transformation

Leetcode 2851. String Transformation 0. 吐槽1. 算法思路 1. 整体思路2. 字符串匹配优化 2. 代码实现 题目链接&#xff1a;2851. String Transformation 0. 吐槽 这道题多少有点坑爹&#xff0c;题目本身挺有意思的&#xff0c;是一道数组题目&#xff0c;其实用数学方法…...

在PHP8中对数组进行计算-PHP8知识详解

在php8中&#xff0c;提供了丰富的计算函数&#xff0c;可以对数组进行计算操作。常见的计算函数如下几个&#xff1a;array_sum()函数、array_merge()函数、array_diff()函数、array_diff_assoc()函数、array_intersect()函数、array_intersect_assoc()函数。 1、array_sum()函…...

Android BottomSheetDialog最大展开高度问题

修改界面的时候遇到了这个问题,这个问题比较简单,网上解决方案也很多,这是 peekHeight 半展开高度,毕竟只是 dialog,全铺满就我们不必考虑 dialog 了 方法是在DialogFragment初始化dialog时处理 companion object {/*** 设置弹窗高度 默认展开无折叠情况 */ const val …...

记录Linux部署人脸修复GFPGAN项目Docker Python 使用

记录Linux 服务器使用人脸修复GFPGAN 项目 1:阿里云安装docker,用docker 是隔离环境,Python环境还真是麻烦… https://help.aliyun.com/zh/ecs/use-cases/deploy-and-use-docker-on-alibaba-cloud-linux-2-instances 2:关于docker 镜像,想找个好的镜像也是很难,百度吧,很多Li…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...