View
通过view,可以改变tensor的视图,例如可以将一个5*3的tensor转化为1*15的形式
代码 |
x = torch.rand(5, 3) #一个5*3的tensor y = x.view(15) #将其转化为1*15的视角 z = x.view(-1, 5) # -1指该维度可以根据其它维度自动计算,例如此处由于规定列是5,所以行应当为3 |
需要注意的是,view返回的新tensor与源tensor共享内存!也就是说,view只不过是改变了对同一对象的观察角度而已,如果更改新tensor,源tensor也会发生改变。
索引
我们可以通过类似numpy中的操作来对tensor中的部分数据进行访问。
同样需要注意的是,索引出来的结果与源数据共享内存!所以如果我们操作索引出来的切片,源数据也会发生改变
代码 |
x = torch.rand(5, 3) y = x[1, :] #取出第一行的所有数据 |
运算的内存开销
View和索引都是不会开辟新内存的,但是形如 ` y = y + x` 这样的运算,是会为y开辟一个新内存的,也就是说,并不是覆盖了原来的y所在位置的数据,而是直接分配了一个新的地址。
如果我们希望将结果指定到原来的y,那么可以通过以下几种操作实现
代码 |
y[ : ] = y + x torch.add(x, y, out = y) #通过out参数来指定结果应该置于什么位置 y += x #使用+=符号赋值,修改的是源数据 y.add_(x) |
numpy与tensor的互相转换
numpy()和from_numpy()两个函数可以方便的进行互换,但是需要注意的是,两个函数所产生的tensor和numpy中的数组是共享内存的,所以这种方法运行速度比较快,改变其中一个,另一个也会改变。(有点类似与view,只不过view是更换了观察维度的角度,而这两个函数则是更换了类型的观察角度)
除了上面的两个函数,还可以通过` torch.tensor()` 来将numpy转化为tensor,需要注意的是,这种方法会进行数据的拷贝,也就是说tensor与numpy并不会共享同一个内存
代码 |
# tensor转numpy x = torch.rand(5, 3) y = x.numpy()
# numpy转tensor x = np.ones(5) y = torch.from_numpy(x)
# 使用torch.tensor()通过numpy来初始化一个tensor x = np.ones(5) y = torch.tensor(x) |