Is torch.as_tensor() the same as torch.from_numpy() for a numpy array on a CPU?
On a CPU, is torch.as_tensor(a) the same as torch.from_numpy(a) for a numpy array, a?  If not, then why not?

From the docs for torch.as_tensor


  if the data is an ndarray of the corresponding dtype and
      the device is the cpu, no copy will be performed.


From the docs for torch.from_numpy:


  The returned tensor and ndarray share the same memory. Modifications to
      the tensor will be reflected in the ndarray and vice versa.


In both cases, any changes the resulting tensor changes the original numpy array.

a = np.array([[1., 2], [3, 4]])
t1 = torch.as_tensor(a)
t2 = torch.from_numpy(a)
t1[0, 0] = 42.
print(a)
# prints [[42., 2.], [3., 4.]]
t2[1, 1] = 55.
print(a)
# prints [[42., 2.], [3., 55.]]


Also, in both cases, attempting to resize_ the tensor results in an error.

They are basically the same, except than as_tensor is more generic:

Contrary to from_numpy, it supports a wide range of datatype, including list, tuple, and native Python scalars.
as_tensor supports changing dtype and device directly, which is very convenient in practice since the default dtype of Torch tensor is float32, while for Numpy array it is float64.

as_tensor is sharing memory with the original data if and only if the original object is a Numpy array, and the requested dtype, if any, is the same than the original data. Those are the same conditions than from_numpy, but are always satisfied by design for the later.
