Изменение массива np не меняет Тензор факела автоматически? - PullRequest
0 голосов
/ 17 сентября 2018

Я изучал основные уроки PyTorch и сталкивался с преобразованием между массивами NumPy и тензорами Torch. В документации написано:

Массив Torch Tensor и NumPy будут совместно использовать свои базовые области памяти, а изменение одного из них изменит другое.

Но, похоже, это не так в приведенном ниже коде:

import numpy as np

a = np.ones((3,3))
b = torch.from_numpy(a)

np.add(a,1,out=a)
print(a)
print(b)

В приведенном выше случае я вижу изменения, автоматически отражаемые в выводе:

[[2. 2. 2.]
 [2. 2. 2.]
 [2. 2. 2.]]
tensor([[2., 2., 2.],
        [2., 2., 2.],
        [2., 2., 2.]], dtype=torch.float64)

Но такого не происходит, когда я пишу что-то вроде этого:

a = np.ones((3,3))
b = torch.from_numpy(a)

a = a + 1
print(a)
print(b)

Я получаю следующий вывод:

[[2. 2. 2.]
 [2. 2. 2.]
 [2. 2. 2.]]
tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]], dtype=torch.float64)

Что мне здесь не хватает?

1 Ответ

0 голосов
/ 18 сентября 2018

Каждый раз, когда вы пишете знак = в Python, вы создаете новый объект.

Таким образом, правая часть вашего выражения во втором случае использует оригинал aи затем оценивает новый объект, то есть a + 1, который заменяет этот оригинал a.b по-прежнему указывает на область памяти оригинала a, но теперь указывает на новый объект в памяти.

Другими словами, в a = a + 1 выражение a + 1 создает новый объект, а затемPython назначает этому новому объекту имя a.

, тогда как при a += 1 Python вызывает a метод сложения на месте (__iadd__) с аргументом 1.

Код NumPy: np.add(a,1,out=a), в первом случае заботится о добавлении этого значения к существующему массиву на месте.

(Спасибо @ Engineero и @ Уоррен Векессер за указание на эти пояснения в комментариях)

...