pytorch 笛卡尔积

什么是笛卡尔积?

待补充

数组的笛卡尔积

>>> a = [1, 2, 3]
>>> b = [4, 5]
>>> list(itertools.product(a, b))
[(1, 4), (1, 5), (2, 4), (2, 5), (3, 4), (3, 5)]
>>> tensor_a = torch.tensor(a)
>>> tensor_b = torch.tensor(b)
>>> torch.cartesian_prod(tensor_a, tensor_b)
tensor([[1, 4],
        [1, 5],
        [2, 4],
        [2, 5],
        [3, 4],
        [3, 5]])

参考: PyTorch - torch.cartesian_prod 对给定的序列张量做笛卡尔乘积。 (runebook.dev)

矩阵的笛卡尔积

import torch

bs, seq_len, dim = 2, 2, 4
x = torch.randn(bs, seq_len, dim)
--------------------------------------------------------
print(x)
tensor([[[-1.3130, -0.7720,  0.1829,  0.0936],
         [-1.2790, -0.7727,  0.0088,  0.0801]],

        [[-0.7498,  0.2078, -1.4679,  1.4730],
         [ 0.8118, -0.4901,  1.1376, -0.6495]]])
--------------------------------------------------------
idx = torch.arange(0, seq_len).long()
iidx = torch.cartesian_prod(idx, idx)
-----------------------------------------
print(iidx)
tensor([[0, 0],
        [0, 1],
        [1, 0],
        [1, 1]])
-----------------------------------------
ii = x[:, iidx]
print(ii)
print(ii.shape)
tensor([[[[-1.3130, -0.7720,  0.1829,  0.0936],
          [-1.3130, -0.7720,  0.1829,  0.0936]],

         [[-1.3130, -0.7720,  0.1829,  0.0936],
          [-1.2790, -0.7727,  0.0088,  0.0801]],

         [[-1.2790, -0.7727,  0.0088,  0.0801],
          [-1.3130, -0.7720,  0.1829,  0.0936]],

         [[-1.2790, -0.7727,  0.0088,  0.0801],
          [-1.2790, -0.7727,  0.0088,  0.0801]]],


        [[[-0.7498,  0.2078, -1.4679,  1.4730],
          [-0.7498,  0.2078, -1.4679,  1.4730]],

         [[-0.7498,  0.2078, -1.4679,  1.4730],
          [ 0.8118, -0.4901,  1.1376, -0.6495]],

         [[ 0.8118, -0.4901,  1.1376, -0.6495],
          [-0.7498,  0.2078, -1.4679,  1.4730]],

         [[ 0.8118, -0.4901,  1.1376, -0.6495],
          [ 0.8118, -0.4901,  1.1376, -0.6495]]]])
torch.Size([2, 4, 2, 4])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值