首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

深度学习基础:1.张量的基本操作

,二维张量可以视为两个一维张量组合而成,而在实际的索引过程中,需要用逗号进行分隔,分别表示对哪个一维张量进行索引、以及具体的一维张量的索引。...[0, ::2] # 表示索引第一行、每隔两个元素取一个 tensor([1, 3]) 注:“:“左右两边为空代表全取。...三维张量索引  在二维张量索引的基础上,三维张量拥有三个索引的维度。我们将三维张量视作矩阵组成的序列,则在实际索引过程中拥有三个维度,分别是索引矩阵、索引矩阵的行、索引矩阵的列。...张量的广播 广播,简单理解,当两个张量维度不同或形状不同时进行计算时,维度小的张量会自动复制自己维度为1的数值,从而顺利实现计算。...,其中的每一行(每一列)分别被称为左奇异向量和右奇异向量,他们和∑中对角线上的奇异值相对应,通常情况下我们只需要保留前k个奇异向量和奇异值即可,其中U是m×k矩阵,V是n×k矩阵,∑是k×k的方阵,从而达到减少存储空间的效果

5K20

PyTorch 知识点归纳 —— 第1篇

张量的数据类型 ① scalar 标量 ② vector 向量 ③ matrix 矩阵 ④ n-dimensional vector 多维张量 # scalar x1 = torch.tensor(5.0...③ t.size() #获取该张量每个维度的大小,调用方法 ④ t.shape #获取该张量每个维度的大小,访问属性 ⑤ view()方法 : view方法作用于原来的张量,传入改变新张量的形状...2]) t2 = torch.tensor([3, 4]) # 加法 t1 + t2 t1.add(t2) # 减法 t1 - t2 t1.sub(t2) # 乘法 t1 * t2 t1.mul(t2...) # 除法 t1 / t2 t1.div(t2) ③ 张量的极值和排序 (1)argmax,argmin返回沿着该维度最大和最小值对应的序号是多少 t = torch.randint(...0, 20, (3, 4)) # 随机产生0 - 20的整数,3行4列 t.argmax(dim=0) # 横轴方向,最大值所在的索引 t.argmin(dim=0) # 横轴方向,最小值所在的索引 torch.max

62520
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    PyTorch的Broadcasting 和 Element-Wise 操作 | PyTorch系列(八)

    如果两个元素在张量内占据相同位置,则称这两个元素是对应的。该位置由用于定位每个元素的索引确定。...我们知道,如果两个元素在张量内占据相同位置,则认为这两个元素是对应的,并且该位置由用于定位每个元素的索引确定。让我们看一个对应元素的例子。 > t1[0][0] tensor(1....) > t2[0][0] tensor(9.) 这使我们看到 t1 中1的对应元素是 t2 中9的元素。 对应关系由索引定义。这很重要,因为它揭示了element-wise 操作的重要特征。...标量的值是0阶张量,这意味着它们没有形状,而我们的张量t1是一个形状为2×2的2阶张量。 这是怎么回事呢?让我们分解一下。...理解element-wise 的操作和相同的形状要求为广播的概念和为什么使用广播提供了基础。 我们什么时候真正使用广播?在预处理数据时,特别是在归一化化过程中,我们经常需要使用广播。

    6.5K61

    PyTorch,TensorFlow和NumPy中Stack Vs Concat | PyTorch系列(二十四)

    > t1.unsqueeze(dim=0)tensor([[1, 1, 1]]) 在这里,我们正在添加一个轴,也就是这个张量的索引零处的尺寸。这给我们一个形状为1 x 3的张量。...当我们说张量的索引为零时,是指张量形状的第一个索引。 现在,我们还可以在该张量的第二个索引处添加一个轴。...添加这样的轴会改变数据在张量内部的组织方式,但不会改变数据本身。基本上,我们只是在重构这个张量。我们可以通过检查每一个的形状看出。...Stack Vs Cat 在PyTorch 使用PyTorch,我们用于这些操作的两个函数是stack和cat。我们来创建一个张量序列。..., 3]]) 正如预期的那样,结果是2阶张量,其形状为3 x3。

    2.5K10

    ——表连接的原理

    索引查找次数:对于B+树索引,查找一行数据的扫描次数大致等于树的深度。设树的深度为h,那么索引查找次数约为h。...驱动表全表扫描次数:N 对于驱动表的每一行记录,到被驱动表上进行索引查找,扫描次数约为:N * 2 * h 所以,整个查询过程的总扫描次数为:N + N * 2 * h = N * (1 + 2 * h...驱动表全表扫描次数:N 对于驱动表的每一行记录,到被驱动表上进行全表扫描查找,扫描次数约为:N * M 所以,整个查询过程的总扫描次数为:N + N * M = N * (1 + M)   在这种情况下...Join Buffer,被驱动表扫描一行会在Join Buffer进行比较,最终扫描N行); 内存中的判断次数是M * N,由于Join Buffer是以无序数组的方式组织的,因此对t2表中的每一行数据...表; 内存判断N * M次,由于Join Buffer是以无序数组的方式组织的,因此对t2表中的每一行数据,都要与Join Buffer中的记录相比较。

    1.9K10

    为何阿里不推荐MySQL使用join?

    从数据行R中,取出a字段到t2里查找 取出t2中满足条件的行,跟R组成一行,作为结果集一部分 重复执行步骤1到3,直到t1的末尾循环结束 这个过程是先遍历t1,然后根据从t1中取出的每行数据中的a值,去...Index Nested-Loop Join算法的执行流程 TODO 该流程: 对驱动表t1做了全表扫描,需扫描100行 对于每一行R,根据a字段去t2查找,这是树搜索。...该示例中,驱动表t1走全表扫描,被驱动表t2走树搜索。 假设被驱动表行数M。每次在被驱动表查一行数据,要先搜索索引a,再搜索主键索引。...每次搜索一棵树的时间复杂度log2M,所以在被驱动表上查一行的时间复杂度是 2*log2M。 假设驱动表行数N,执行过程就要扫描驱动表N行,然后对每一行,到被驱动表上匹配一次。...扫描t2,把t2中的每一行取出来,对比join_buffer数据,满足join条件的,作为结果集的一部分返回。

    89720

    关于张量的Flatten、Reshape和Squeeze的解释 | Pytorch系列(六)

    这是因为,就像我们在介绍张量的帖子(张量解释——深度学习的数据结构)中提到的那样,张量的形状为我们提供了一些具体的东西,形成对张量的直观感受。...在我们的例子中,这是: rows * columns = 12 elements 当我们处理一个二阶张量时,我们可以用直观的词 行和列。...., 3.] ] ]) 在本例中,我们将阶增加到3,因此我们没有了行和列的概念。然而,形状分量(2,2,3)的乘积仍然必须等于原始张量中的元素个数(12)。...假设我们有两个张量: > t1 = torch.tensor([ [1,2], [3,4] ]) > t2 = torch.tensor([ [5,6], [7,8] ]...) 我们可以将 t1 和 t2 按行(axis-0)组合如下: > torch.cat((t1, t2), dim=0) tensor([[1, 2], [3, 4],

    5.1K20

    Tensorflow基础入门十大操作总结

    = tf.Graph() # 定义一个计算图 with g.as_default(): ## 定义张量t1,t2,t3 t1 = tf.constant(np.pi) t2 =...执行计算图: a.开始一个新的会话 b.初始化图中的变量 c.运行会话中的计算图 # 初始化一个空的计算图 g = tf.Graph() # 为该计算图加入节点(张量和操作) with g.as_default...八、把张量转换成多维数据阵列 8.1 获得张量的形状 在numpy中我们可以用arr.shape来获得Numpy阵列的形状,而在Tensorflow中则用tf.get_shape函数完成: 注意:在tf.get_shape...函数的结果是不可以索引的,需要用as.list()换成列表才能索引。...8.2 改变张量的形状 现在来看看Tensorflow如何改变张量的形状,在Numpy可以用np.reshape或arr.reshape,在一维的时候可以用-1来自动计算最后的维度。

    95630

    Tensorflow基础入门十大操作总结

    tf.Graph()# 定义一个计算图with g.as_default(): ## 定义张量t1,t2,t3 t1 = tf.constant(np.pi) t2 = tf.constant...执行计算图: a.开始一个新的会话 b.初始化图中的变量 c.运行会话中的计算图 # 初始化一个空的计算图g = tf.Graph() # 为该计算图加入节点(张量和操作)with g.as_default...八、把张量转换成多维数据阵列 8.1 获得张量的形状 在numpy中我们可以用arr.shape来获得Numpy阵列的形状,而在Tensorflow中则用tf.get_shape函数完成: 注意:在tf.get_shape...函数的结果是不可以索引的,需要用as.list()换成列表才能索引。...8.2 改变张量的形状 现在来看看Tensorflow如何改变张量的形状,在Numpy可以用np.reshape或arr.reshape,在一维的时候可以用-1来自动计算最后的维度。

    1.1K20

    MySQL Join工作原理

    通过explain,我们可以看出,在join的过程中用上了被驱动表t2的索引a,整个语句的执行流程如下: 从表t1中读取一行 从数据行R中,取出a字段去表t2里面去查找 取出表t2中满足条件的行,跟R组成一行...,作为结果集的一部分 重复执行步骤1-3,直到表t1的末尾循环结束 驱动表是全表扫描,因此需要扫描100行 对于每一行R,根据a字段去表t2查找,走的是树搜锁过程,由于我们构造的数据一一对应,因此每次只扫描...假设驱动表的行数为N,每执行过程中要扫描N行,对于我们构造的表每一行到被驱动表上只匹配一次,因此整个执行的复杂度=N + N * 2 * log2(M)。...中,由于这里是select *,因此是把整个表t1放入内存 扫描t2,把表t2中的每一行取出来,跟join_buffer中的数据做对比,满足join条件的会作为结果集的一部分进行返回 explain select...t2中的每一行,都要做100次判断,因此在内存中的判断次数是100*1000 = 10w次,但由于是在内存中进行,速度上还可以接受。

    44120

    MySQL实战第三十四讲- 到底可不可以使用join?

    从表 t1 中读入一行数据 R; 2. 从数据行 R 中,取出 a 字段到表 t2 里去查找; 3. 取出表 t2 中满足条件的行,跟 R 组成一行,作为结果集的一部分; 4. ...而对于每一行 R,根据 a 字段去表 t2 查找,走的是树搜索过程。由于我们构造的数据都是一一对应的,因此每次的搜索过程都只扫描一行,也是总共扫描 100 行; 3. ...每次搜索一棵树近似复杂度是以 2 为底的 M 的对数,记为 log2M,所以在被驱动表上查一行的时间复杂度是 2*log2M。...假设驱动表的行数是 N,执行过程就要扫描驱动表 N 行,然后对于每一行,到被驱动表上匹配一次。 因此整个执行过程,近似复杂度是 N + N*2*log2M。...扫描表 t2,把表 t2 中的每一行取出来,跟 join_buffer 中的数据做对比,满足 join 条件的,作为结果集的一部分返回。

    39850

    34 | join语句的使用

    该语句的执行流程是这样的: 从表 t1 中读入一行数据 R; 从数据行 R 中,取出 a 字段到表 t2 里去查找; 取出表 t2 中满足条件的行,跟 R 组成一行,作为结果集的一部分; 重复执行步骤...在这个流程里: 对驱动表 t1 做了全表扫描,这个过程需要扫描 100 行; 以上扫描出来的每一行R,根据a字段去表t2查询,走的是树搜索过程(唯一索引),因此每次搜索的过程只扫描一行,也是总共扫描100...每次搜索一棵树近似复杂度是以 2 为底的 M 的对数,记为 log2M,所以在被驱动表上查一行的时间复杂度是 2*log2M。...假设驱动表的行数是 N,执行过程就要扫描驱动表 N 行,然后对于每一行,到被驱动表上匹配一次。 因此整个执行过程,近似复杂度是 N + N2log2M。 显然 N 的增大 比M 的增大要 大得多。...,算法的流程是这样的: 把表 t1 的数据读入线程内存 join_buffer 中,由于我们这个语句中写的是 select *,因此是把整个表 t1 放入了内存; 扫描表 t2,把表 t2 中的每一行取出来

    80820

    MySQL中的join语句

    ,t1表的扫描是全表扫描的,t2表的扫描方式是ref类型,用到了普通索引a,这里我要强调的两点是: 1、在连接查询的执行计划中,每个表都会对应一条记录,这些记录的id列的值是相同的,出现在前边的表表示驱动表...整个join语句的执行过程如下: a、从表t1中拿到一条记录的字段a值 b、拿a的值去t2表中查找,查找匹配的行 c、找到结果,和表t1中的行拼接成一行记录,作为结果的一条记录 d、重复以上三个步骤,直到...整个过程的复杂度如下: a、扫描表t1的所有100行记录 b、一行一行的用t1的字段a去t2中进行查找,查找的过程中会用到t2的索引,所以在t2上一共也只扫描了100行。...这里,我们简单推一下复杂度的公式: 假设驱动表的记录为M,被驱动表的值是N,因为被驱动表使用了索引,在一棵b+树上索引的查找效率近似logN,因为我们的语句时select * ,要牵扯到回表到聚集索引查询所有字段...显然,M对于复杂度的提升是大于N的,而M是我们驱动表的记录,这也就意味着,为了降低复杂度,M的值越小越好。也就是我们常说的,连接查询时,最好要"小表驱动大表"。

    2.1K10

    一文搞懂MySQL的Join,聊一聊秒杀架构设计

    *fromt1leftjoint2on(t1.username=t2.username) 那么这条SQL的执行步骤如下: 从表t1中取一行数据r1 从r1中,取出字段username到表t2中查询 取出表...t2中满足条件的行,跟r1组成一行,作为结果集的一部份 重复执行步骤1,2,3,直到表t1的所以数据循环完毕 基本上先遍历t,1,然后根据t1中的每行数据中的username,去表t2中查找满足条件的记录...如何优化join查询 从上面可以看出,join本质是循环,这里的开销如下: 遍历t1数据,读取数据为t1表的行数,假设行数为n,则复杂度也为n 根据t1的匹配字段username去t2中一行一行的查询数据...这个过程,因为MySQL的数据存储结构为二叉树,时间复杂度为log2(m) m为t2表的总行数 那么总复杂度近似为 n+n(2log2(m)) 从上面的步骤可以看出,优化方向: 降低t1查询时的开销,...Nested Loop Join 主要是针对t2表上没有索引,在步骤2将t2中的每一行数据跟join buffer数据做对比,这样将磁盘操作转为内存操作进行比较,但是如果被驱动表的数据比较大的话,也影响性能

    1.3K10

    MySQL 的 join 功能弱爆了?

    image.png 需要注意的是,在第二步中,根据 a 字段去表t1中查询时,使用了索引,所以每次扫描只会扫描一行(从explain结果得出,根据不同的案例场景而变化)。...因为在这个 join 语句执行过程中,驱动表是走全表扫描,而被驱动表则使用了索引,并且驱动表中的每一行数据都要去被驱动表中进行索引查询,所以整个 join 过程的近似复杂度是 N2log2M。...t2 的数据读取当前线程的 join_buffer 中,在本篇文章的示例 SQL 没有在 t2 上做任何条件过滤,所以就是讲 t2 整张表 放入内存中; 扫描表 t1,每取出一行数据,就跟 join_buffer...可以看出 image.png 可以看出,这次 join 过程对 t1 和 t2 都做了一次全表扫描,并且将表 t2 中的 500 条数据全部放入内存 joinbuffer 中,并且对于表 t1 中的每一行数据...t1,每取出一行符合条件的数据,也对其 join 字段值进行 hash 操作,拿结果到内存的散列表中查找匹配,如果找到,则成为结果集的一部分。

    1K00
    领券