Как карта Python работает с torch.tensor? - PullRequest
0 голосов
/ 27 мая 2019

Я сейчас на питоне, поэтому я пытаюсь понять эту строку из Pytorch Tutorial .

x_train, y_train, x_valid, y_valid = map(
    torch.tensor, (x_train, y_train, x_valid, y_valid)
)

Я понимаю, как карта работает на одном элементе

def sqr(a):
    return a * a

a = [1, 2, 3, 4]    

a = map(sqr, a)
print(list(a))

И здесь мне нужно использовать list(a) для преобразования объекта карты обратно в список.

Но что я не понимаю, как это работает с несколькими переменными?

Если я попытаюсь сделать это

def sqr(a):
    return a * a


a = [1, 2, 3, 4]
b = [1, 3, 5, 7]

a, b = map(sqr, (a, b))
print(list(a))
print(list(b))

Я получаю ошибку: TypeError: can't multiply sequence by non-int of type 'list'

Пожалуйста, уточните это для меня Спасибо

1 Ответ

0 голосов
/ 28 мая 2019

map работает с одним так же, как и со списком / кортежем списков, он выбирает элемент заданного ввода независимо от того, что это такое.

Причина, по которой torch.tensor работает, если принимает список в качестве входных данных.

Если развернуть следующую предоставленную вами строку:

x_train, y_train, x_valid, y_valid = map(
    torch.tensor, (x_train, y_train, x_valid, y_valid)
)

это то же самое, что и делать:

x_train, y_train, x_valid, y_valid = [torch.tensor(x_train), torch.tensor(y_train), torch.tensor(x_valid), torch.tensor(y_valid)]

С другой стороны, ваша функция sqr не принимает списки.Предполагается, что скалярный тип возводится в квадрат, что не относится к вашим a и b, это списки.

Однако, если вы измените sqr на:

def sqr(a):
    return [s * s for s in a]


a = [1, 2, 3, 4]
b = [1, 3, 5, 7]

a, b = map(sqr, (a, b))

или, как предложено @Jean, a, b = map(sqr, x) for x in (a, b)

Это будет работать.

...