PyTorchのTensor配列と、Numpyのndarray配列の変換方法についてまとめました。
とりあえず直ぐに使いたい方向けのコードは以下
# Numpy > Tensor
a = torch.from_numpy(a).clone()
# Tensor > Numpy
a = a.cpu().detach().numpy().copy()
ndarrayからtensorへの変換
ndarrayからtensorへの変換には、torch.from_numpyを用いる。引数にndarray配列を与えれば、tensor配列を得ることができる。この方法は、ndarray配列とtensor配列でメモリが共有されるため、一方の値を変えると一方の値も変わる。
a = numpy.array([1, 2, 3])
t = torch.from_numpy(a)
print(t)
# tensor([1, 2, 3])
t[0] = -1
print(t)
# tensor([-1, 2, 3])
print(a)
# [-1 2 3]
メモリを共有させない方法(ndarray > tesnor)
ndarray配列とtensor配列のメモリを共有させない場合は、cloneメソッドを使う。
a = numpy.array([1, 2, 3])
t = torch.from_numpy(a).clone()
print(t)
# tensor([1, 2, 3])
t[0] = -1
print(t)
# tensor([-1, 2, 3])
print(a)
# [1 2 3]
tensorからndarrayへの変換
tensorからndarrayへの変換には、numpyメソッドを使う。こちらもメモリが共有される。
t = torch.tensor([1, 2, 3])
a = t.numpy()
print(a)
# [1 2 3]
a[0] = -1
print(a)
# [-1 2 3]
print(t)
# tensor([-1, 2, 3])
メモリを共有させない方法(tensor > ndarray)
tensor配列とndarray配列のメモリを共有させない場合は、copyメソッドを使う。
t = torch.tensor([1, 2, 3])
a = t.numpy().copy()
print(a)
# [1 2 3]
a[0] = -1
print(a)
# [-1 2 3]
print(t)
# tensor([-1, 2, 3])
tensor配列がGPUに置かれている場合
tensor配列がGPUに置かれている場合、ndarrayはGPUを使えないため、エラーが発生する。このため、tensor配列をcpuに移動する必要がある。cpuに移動するにはcpuメソッドを使う。
TypeError: can’t convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first.
t = torch.tensor([1, 2, 3]).to('cuda')
print(t)
# tensor([1, 2, 3], device='cuda:0')
a = t.cpu().numpy().copy()
print(a)
# [1 2 3]
tensor配列が勾配計算ONになっている場合(requires_grad=True)
tensor配列がrequires_grad=Trueになっている場合、ndarrayは勾配計算機能を使えないため、エラーが発生する。そのため、detachメソッドを使って勾配計算グラフから切り離す必要がある。
RuntimeError: Can’t call numpy() on Tensor that requires grad. Use tensor.detach().numpy() instead.
t = torch.tensor([0.1, 2, 3], requires_grad=True).to('cuda')
print(t)
# tensor([0.1000, 2.0000, 3.0000], device='cuda:0', grad_fn=<ToCopyBackward0>)
a = t.cpu().detach().numpy().copy()
print(a)
# [0.1 2. 3. ]
コメント