如何遍历一组张量并将每个组中的元素传递给函数?

时间:2019-04-12 13:08:00

标签: python function iteration pytorch tensor

假设您有3个相同大小的张量:

    ID <- c("f1", "f1", "f1", "f1", "f2", "f2", "f2", "f2", "f3", "f3", "f3", "f3")
    time <- rep(c(66, 68, 70, 72), 3)
    obs <- c(1, 3, 5, 6, 0, 0, 3, 4, 0, 1, 3, 3)
    new.time <- c(0, 2, 4, 6, NA, NA, 0, 2, NA, 0, 2, 4)
    data <- as.data.frame(cbind(ID, time, obs, new.time))

在Lua(torch7)中,它们具有this功能:

a = torch.randn(3,3)                    
a = ([[ 0.1945,  0.8583,  2.6479],       
    [-0.1000,  1.2136, -0.3706],
    [-0.0094,  0.4279, -0.6840]])

b = torch.randn(3, 3)
b = ([[-1.1155,  0.2106, -0.2183],
    [ 1.6610, -0.6953,  0.0052],
    [-0.8955,  0.0953, -0.7737]])

c = torch.randn(3, 3)
c = ([[-0.2303, -0.3427, -0.4990],
    [-1.1254,  0.4432,  0.3999],
    [ 0.2489, -0.9459, -0.5576]])

将给定的[self] map2(tensor1, tensor2, function(x, xt1, xt2)) 应用于function的所有元素。

我的问题是:

  1. python(pytorch)中是否有任何类似的功能?
  2. 在不使用selffor loop的情况下,是否有任何pythonic方法可以迭代3个张量并获取每个张量的各个元素?

例如:

indices

编辑_1:我也尝试过itertools.zip_longest和zip,但是结果与上面提到的不一样

1 个答案:

答案 0 :(得分:2)

您可以使用Python的map函数,类似于您提到的函数。像这样:

>>> tensor_list = [torch.tensor([i, i, i]) for i in range(3)]
>>> list(map(lambda x: x**2, tensor_list))
[tensor([0, 0, 0]), tensor([1, 1, 1]), tensor([4, 4, 4])]
>>> 

编辑:对于仅使用PyTorch的方法,您可以使用torch.Tensor.apply_(请注意,这会进行适当的更改,并且不会返回新的张量)

>>> x = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
>>> x.apply_(lambda y: y ** 2)
tensor([[ 1,  4,  9],
        [16, 25, 36],
        [49, 64, 81]])
>>>