Как перебрать группу тензоров и передать элементы из каждой группы в функцию? - PullRequest
3 голосов
/ 12 апреля 2019

Предположим, у вас есть 3 тензора одинакового размера:

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]])

В Lua (torch7) они имеют эту функцию:

[self] map2(tensor1, tensor2, function(x, xt1, xt2))

, который применяет данное function ко всем элементам self.

Мои вопросы:

  1. Есть ли подобная функция в python (pytorch)?
  2. Существует ли какой-либо питонный метод для перебора трех тензоров и получения соответствующих элементов каждого тензора без использования for loop и indices?

Например:

0.1945 -1.1155 -0.2303
0.8583 0.2106 -0.3427
2.6479 -0.2183 -0.4990
-0.1000 1.6610 -1.1254
...

Edit_1: я также попробовал itertools.zip_longest и zip, но результаты не такие, как я ожидал, как указано выше

1 Ответ

2 голосов
/ 12 апреля 2019

Вы можете использовать функцию 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]])
>>> 
...