1. 简述
torch.meshgrid
生成网格,可以用于生成坐标。函数输入两个数据类型相同的一维张量,两个输出张量的行数为第一个输入张量的元素个数,列数为第二个输入张量的元素个数,当两个输入张量数据类型不同或维度不是一维时会报错。
原型
torch.meshgrid(*tensors, indexing=None)
indexing = ‘ij’ 行优先(默认)
indexing = ‘xy’ 列优先
2. 行优先
第一个Tensor确定行数,和每行的值,然后向右复制。
也可以看做是确定了第一列。
第二个Tensor确定列数,以及每一列的值,然后向下复制。
一般情况下,torch.meshgrid的输入参数中,有两个tensor,均应该是一维的tensor。如torch.meshgrid(a_tensor, b_tensor, indexing=’ij’),表示首先把a_tensor当做第一列,然后根据b_tensor的元素数量,确定复制几列。
总结起来就是“向右向下复制”
3. 列优先
与“列优先”相反,第一个Tensor先确定列数和每列的取值,第二个Tensor先确定行数和每行的取值。
4. 行优先举例
sx = torch.arange(end=5)
sy = torch.arange(end=6)
sy, sx = torch.meshgrid(sy, sx, indexing='ij')
print(f"sy: {sy}")
print(f"sx: {sx}")
得到结果如下所示:
sy: tensor([[0, 0, 0, 0, 0],
[1, 1, 1, 1, 1],
[2, 2, 2, 2, 2],
[3, 3, 3, 3, 3],
[4, 4, 4, 4, 4],
[5, 5, 5, 5, 5]])
sx: tensor([[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4]])
可以看出如下特征:
sy首先确定了行数,以及每一行的取值,另一种理解可以是。之后相当于复制多列,具体复制多少列呢,取决于sx的元素数量。
sx首先确定了列数,以及每一列的取值,然后复制多行。
5. 列优先举例
sx = torch.arange(end=5)
sy = torch.arange(end=6)
sy, sx = torch.meshgrid(sy, sx, indexing='xy')
print(f"sy: {sy}")
print(f"sx: {sx}")
得到的结果如下所示:
sy: tensor([[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5]])
sx: tensor([[0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1],
[2, 2, 2, 2, 2, 2],
[3, 3, 3, 3, 3, 3],
[4, 4, 4, 4, 4, 4]])
如上所示,可以看出如下特征:
sy首先确定了列数和每一列的取值,即确定了第一行。之后根据sx的元素数量确定复制几行。
sx首先确定了行数,以及每一行的取值,然后复制多列。
6. 特别说明
我们在基于PyTorch框架开发深度学习工程时,有时会制作Tensor的索引矩阵,此时应该是用行优先模式,即:sy, sx = torch.meshgrid(sy, sx, indexing='ij')这一种形式,然后将sy和sx进行torch.stack结合操作。