tensor数据基操----索引与切片

玩过深度学习图像处理的都知道,对于一张分辨率超大的图片,我们往往不会采取直接压平读入的方式喂入神经网络,而是将它切成一小块一小块的去读,这样的好处就是可以加快读取速度并且减少内存的占用。就拿医学图像处理来说吧,医学CT图像一般都是比较大的,一张图片就可能达到500MB+,有的甚至超过1GB,下面是切过的一张已经被各种压缩过的肝脏CT图像的一角。

      

我们可以看到它的像素仍有5210*4200之多,如果直接把这样一张图片压平,将会得到一个5210*4200=21882000维的tensor,将这样一个上千万维的数据直接喂入神经网络,我不知道性能特别特别好的电脑能不能撑起来,反正我的电脑是肯定崩溃。那么如何处理这样图片呢?回到我们的标题----索引和切片。通过切片的方式我们可以把这张图片分成若干28*28(或者其他合适分辨率)的小图,分批次将这张图喂入神经网络,可想而知会取得不错的效果。接下来就记录几种索引切片的方式。

方式1:通过连续的[ ]

这种方式在各种编程语言中都很常见,即数组的索引,但是这种方式只能取到某一具体维度的数值,不能随心所欲的固定间隔或者非固定间隔的切片

a = tf.ones([1,5,5,3])
print(a[0][0])
print(a[0][0][0])
print(a[0][0][0][2])

方式2:通过[ ,  ,  ,……]

这种方式其实是numpy对方式1的一种在可读性方面的优化,和方式1相比,可读性明显提高

a = tf.random.normal([4,28,28,3])
print(a[1].shape)
print(a[1,2].shape)
print(a[1,2,3].shape)
print(a[1,2,3,2].shape)

方式3:一维tensor可通过[ :]

这种方式也是python中比较常用的数组切片方式,切片范围[ A:B)

a=tf.range(10)
print(a)
print(a[-1:])
print(a[-2:])
print(a[:2])
print(a[:-1])

方式4:对于多维tensor可通过[ ,:,:,:……]

相对前面几种切片方式都更加丰富,也可以完成多样的切片(跳过某一维度)start:end

a = tf.random.normal([4,28,28,3])
print(a[0,:,:,:].shape)
print(a[0,1,:,:].shape)
print(a[:,:,:,0].shape)
print(a[:,:,:,2].shape)
print(a[:,0,:,:].shape)

方式5:隔行采样[ : : ,: : ,: : ,……]

通过增加了一个:,使用方式start:end:step进行间隔采样(::step代表从最开始到最末尾以步长step间隔采样)

a = tf.random.normal([4,28,28,3])
print(a[:,0:28:2,0:28:2,:].shape)
print(a[:,:14,:14,:].shape)
print(a[:,14:,14:,:].shape)
print(a[:,::2,::2,:].shape)

注:若step<0则倒序采样

方式6:用…进行采样

...可以代替连续的:,增强代码的易书写性和可读性

a = tf.random.normal([2,4,28,28,3])
print(a[0,:,:,:,:].shape)
print(a[0,...].shape)
print(a[:,:,:,:,0].shape)
print(a[...,0].shape)
print(a[0,...,2].shape)
print(a[1,0,...,0].shape)

方式6:selective indexing

使用tf.gather、tf.gather_nd、tf.boolean_mask进行随机采样

(1)tf.gather(在某一维度指定index)

# 下面的tensor即表示,4个班级,每个班级35名学生,每个学生8门课的成绩
a = tf.random.normal([4,35,8])
# axis表示维度,indices表示在axis维度上要取数据的索引
print(tf.gather(a,axis=0,indices=[2,3]).shape) # 可理解为取第2、3个班级的学生成绩,同a[2:4].shape
print(tf.gather(a,axis=0,indices=[2,1,3,0]).shape) # 可理解为依次取第2、1、3、0个班级的学生成绩
print(tf.gather(a,axis=1,indices=[2,3,7,9,16]).shape) # 可理解为取所有班级第2,3,7,9,16个学生的成绩
print(tf.gather(a,axis=2,indices=[2,3,7]).shape) # 可理解为取所有班级所有学生第2,3,7门课的成绩

(2)tf.gather_nd(在多个维度指定index)

a = tf.random.normal([4,35,8])
# axis表示维度,indices表示在axis维度上要取数据的索引
print(tf.gather_nd(a,[0]).shape) # 可理解为取0号班级的所有成绩
print(tf.gather_nd(a,[0,1]).shape) # 可理解为取0号班级1号学生的成绩
print(tf.gather_nd(a,[0,1,2]).shape) # 可理解为取0号班级1号学生的第2门课成绩
print(tf.gather_nd(a,[[0,0],[1,1]]).shape) # 可理解为取0号班级0号学生和1号班级1号学生的成绩
print(tf.gather_nd(a,[[0,0],[1,1],[2,2]]).shape) # 可理解为取0号班级0号学生、1号班级1号学生、2号班级2号学生的成绩
print(tf.gather_nd(a,[[0,0,0],[1,1,1],[2,2,2]]).shape) # 可理解为0班0学0课,1班1学1课,2班2学2课的成绩
print(tf.gather_nd(a,[[[0,0,0],[1,1,1],[2,2,2]]]).shape) # shape与上不同

(3)tf.boolean_mask(通过True和False的方式选择数据)

a = tf.random.normal([4,28,28,3])
print(tf.boolean_mask(a,mask=[True,True,False,False]).shape)
print(tf.boolean_mask(a,mask=[True,True,False],axis=3).shape)
a = tf.ones([2,3,4])
print(tf.boolean_mask(a,mask=[[True,False,False],[False,True,True]]))

原文地址:https://www.cnblogs.com/zdm-code/p/12207663.html

时间: 2024-08-04 07:14:25

tensor数据基操----索引与切片的相关文章

乐哥学AI_Python(二):Numpy索引,切片,常用函数

Numpy的索引和切片 ndarray对象的内容可以通过索引和切片查看和修改. 索引:ndarray对象中的元素索引基于0开始 切片:对数组里某个片段区域的描述 数组的切片也可以理解为原始数组的局部视图,都是指向内存中的原始数组,所以不同于列表复制,切片上的修改都会直接反映到原始数组上. 索引切片的实例代码演示: Numpy常用函数的代码演示: Numpy的置换函数transpose.T和swapaxes演示与区别 T适用于一.二维数组 arr = np.arange(12).reshape(3

NumPy数组基本的索引和切片

对一维数组来说,NumPy数组的索引切片与Python列表的功能差不多: >>> arr array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> arr[3] 3 >>> arr[2:6] array([2, 3, 4, 5]) >>> arr[3:] array([3, 4, 5, 6, 7, 8, 9]) 但是,特别注意的是,如果要将一个标量值赋值给一个切片,这个修改会直接反映到源数组上(即使你已经新建

NumPy学习(索引和切片,合并,分割,copy与deep copy)

NumPy学习(索引和切片,合并,分割,copy与deep copy) 目录 索引和切片 合并 分割 copy与deep copy 索引和切片 通过索引和切片可以访问以及修改数组元素的值 一维数组 程序示例 import numpy as np #索引与切片 array=np.arange(3,15) print(array) print(array[3])#数组下标为3的元素 print('\n') print(array[1:3])#取从下标1到下标3,不包括下标3 print(array[

Numpy学习二:数组的索引与切片

1.一维数组索引与切片#创建一维数组arr1d = np.arange(10)print(arr1d) 结果:[0 1 2 3 4 5 6 7 8 9] #数组的索引从0开始,通过索引获取第三个元素arr1d[2] 结果:2 #切片,左闭右开区间,从索引3开始,直到索引7结束 arr1d[3:8] 结果:array([3, 4, 5, 6, 7]) #数组脚标由右往左是从-1开始,每向左一位脚标数字减1,获取最后一个元素arr1d[-1] #等价arr1d[9] 结果:9 #将标量赋值给切片,会

Python--时间序列.s(索引、切片、重采样)

时间序列    索引 / 切片 / 重采样 时间序列  ?? 索引 # 示例数据 import numpy as np import pandas as pd import datetime times = pd.date_range('2019-1-1',periods=10,freq='MS') ps = pd.Series(np.random.rand(len(times)),index=times) #-----输出-----# 2019-01-01 0.374180 2019-02-0

字符串的索引和切片

本文主要介绍:字符串的索引,切片及求字符串的长度 代码: #!/usr/bin/env python# author by lh# -*- coding:utf-8 -*- s='hello'ret=len(s)print retret1=s[0:3]print ret1print s[0]print s[1]print s[2]print s[3]print s[4] 运行结果:

多表利用DIH批量导入数据并建立索引注意事项

如果希望同时对多个表进行全文检索,那我们该如何处理呢?利用DIH导入数据并建立索引时.schema.xml中配置了uniqueKey为id <uniqueKey>id</uniqueKey> 如果多表主键都为id的话索引会被覆盖 <!--deltaImportQuery和deltaQuery为增量导入时使用.--> <entity name="case" pk="id" query="SELECT id,title

python——入门系列(一)索引与切片

1.索引和切片:python当中数组的索引和其他语言一样,从0~n-1,使用索引的方法也是中括号,但是python中的切片的使用简化了代码 索引:取出数组s中第3个元素:x=s[2] 切片:用极少的代码将数组元素按需处理的一种方法.切片最少有1个参数,最多有3个参数,演示如下: 我们假设下面所用的数组声明为array=[2,3,4,5,6] 1个参数: array[1:]——从下标为1的元素选择到最后一个元素,返回 [4,5,6] array[:3]——从下标为0的元素选择到下标为2的元素,不包

Excel数据智能展现之三,切片器

在Excel 2013中,利用数据透视表中的“切片器”功能,我们可以从多个维度筛选和分析数据,用最少的时间,完成更多的数据分析工作. (1)在Excel 2013工作表中,基于准备好的数据源创建数据透视表后,即可在“数据透视表工具”下的“分析”上下文选项卡的“筛选”选项组中,单击[插入切片器]按钮,打开“插入切片器”对话框. (2)在对话框中,根据实际需要,选中某几个字段前的复选框,最后单击[确定]按钮,即可创建多个切片器. (3)适当调整每一个切片器的位置,以使所有数据都清晰可见.直接在切片器