Да, t
и arr
- это разные Python объекты в разных областях памяти (следовательно, разные id
), но оба указывают на один и тот же адрес памяти, который содержит данные (смежные (обычно) C массив).
numpy
работает в этом регионе с использованием кода C
, связанного с функциями Python
, то же самое относится и к torch
(но с использованием C++
). id()
ничего не знает об адресе памяти самих данных, только об их «обертках».
РЕДАКТИРОВАТЬ: Когда вы назначаете b = a
(при условии a
равен np.array
), оба являются ссылками на одну и ту же оболочку Python (np.ndarray
). Другими словами это один и тот же объект с другим именем .
Это просто, как работает назначение Python, см. документацию . Все приведенные ниже случаи также вернут True
:
import torch
import numpy as np
tensor = torch.tensor([1,2,3])
tensor2 = tensor
id(tensor) == id(tensor2)
arr = np.array([1, 2, 3, 4, 5])
arr2 = arr
id(arr) == id(arr2)
some_str = "abba"
other_str = some_str
id(some_str) == id(other_str)
value = 0
value2 = value
id(value) == id(value2)
Теперь, когда вы используете torch.from_numpy
на np.ndarray
, у вас есть два объекта разных классов (torch.Tensor
и оригинальный np.ndarray
). ). Поскольку они бывают разных типов, они не могут иметь одинаковые id
. Можно видеть, что этот случай аналогичен приведенному ниже:
value = 3
string_value = str(3)
id(value) == id(string_value)
Здесь интуитивно понятно, что string_value
и value
- два разных объекта в разных местах памяти.
РЕДАКТИРОВАНИЕ 2:
Все во всех концепциях Python объекта и базового C массива должны быть разделены. id()
не знает о C привязках (как это могло быть?), Но он знает об адресах памяти структур Python (torch.Tensor
, np.ndarray
).
В случае numpy
и torch.tensor
возможны следующие ситуации:
- отдельно на уровне Python, но с использованием той же области памяти для массива (
torch.from_numpy
) - отдельно на уровне Python и в основной области памяти (одна
torch.tensor
и другая np.array
). Может быть создан с помощью from_numpy
с последующей clone()
или аналогичной операцией глубокого копирования. - то же самое на уровне Python и базовой области памяти (например, два объекта
torch.tensor
, один ссылается на другой, как указано выше) )