x.reshape()
作用:以相应的维度,改变tensor。
注:修改的shape必须满足原来的tensor和reshape的tensor元素个数相等,比如原来tensor的shape为(2,2,3),元素个数为12,那么要进行reshape必须满足元素个数为12,如(4,3,1),(3,2,2)等等。
rehsape函数有一个比较特殊的-1,-1的值为总元素个数除以(其他维度值相乘)
比如原始tensor维度为(2,2,3),reshape为(-1,3,4),-1的值就为12/(3×4)=1,即reshape后的tensor的shape为(1,3,4)
torch示例:
import torch
x = torch.tensor([[[1, 2, 3], [4, 5, 6]],
[[7, 8, 9], [10, 11, 12]]])
b = x.reshape((4, 3, 1))
c = x.reshape((1, 3, 4))
d = x.reshape((12, 1))
print('x_shape:', x.shape) # torch.Size([2, 2, 3])
print('b_shape:', b.shape) # b_shape: torch.Size([4, 3, 1])
print('c_shape:', c.shape) # c_shape: torch.Size([1, 3, 4])
print('d_shape:', d.shape) # d_shape: torch.Size([12, 1])
print('x:', x)
print('b:', b)
print('c:', c)
print('d:', d)
x.reshape()
numpy的reshape有个order 参数, 默认order=‘C’。
order : 可选范围为{‘C’, ‘F’, ‘A’}
(1)“C”指的是用类C写的读/索引顺序的元素,最后一个维度变化最快,第一个维度变化最慢。以二维数组为例,简单来讲就是横着读,横着写,优先读/写一行。
(2)“F”是指用FORTRAN类索引顺序读/写元素,最后一个维度变化最慢,第一个维度变化最快。竖着读,竖着写,优先读/写一列。注意,“C”和“F”选项不考虑底层数组的内存布局,只引用索引的顺序。
3)“A”选项所生成的数组的效果与原数组a的数据存储方式有关,如果数据是按照FORTRAN存储的话,它的生成效果与”F“相同,否则与“C”相同。
注:FORTRAN和C是两个语言,他们存储数组的方式不同,FORTRSAN为列优先,而C为行优先。在python中默认数组生成的时候是按照C的方式进行存储。但,很多时候我们需要调用Fortran的一些库进行数学计算,所以需要让numpy生成的数组变成按照FORTRAN的方式存储,使用numpy.asfortranarray方法。
import numpy as np
x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
x = x.reshape((1, 1, 1, 2, 5))
print('x_shape:', x.shape) # (1, 1, 1, 2, 5)