Pandas, Numpy, PyTorch, PIL, OpenCV相互変換チートシート
Pandas、Numpy、PyTorch、PIL、OpenCVなどのライブラリ間のデータ相互変換は、機械学習や画像処理で頻繁に必要となります。この記事では、これらのライブラリ間でデータを変換する方法を早見表形式でまとめました。相互変換を素早く確認できるリファレンスとして活用ください。
Pandas⇆Numpy
pandas→numpy
to_numpy()
で、numpyのndarrayに変換できます。
import pandas as pd
df = pd.DataFrame({"a":[1,2,3],"b":[4,5,6],"c":[7,8,9]})
print(df)
# a b c
# 0 1 4 7
# 1 2 5 8
# 2 3 6 9
data = df.to_numpy()
print(data)
# [[1 4 7]
# [2 5 8]
# [3 6 9]]
numpy→pandas
numpyからpandasへの変換は、DataFrame()
の引数にndarrayを入力します。columnsとindexは、必要であれば設定します。
import pandas as pd
data = np.array([i for i in range(10)]).reshape(5, 2)
print(data)
# [[0 1]
# [2 3]
# [4 5]
# [6 7]
# [8 9]]
df = pd.DataFrame(data,
columns = ["x","y"],
index = list("abcde")
)
print(df)
# x y
# a 0 1
# b 2 3
# c 4 5
# d 6 7
# e 8 9
Pandas⇆辞書型(dict)
pandas→dict
辞書型への変換は、いくつかのバリエーションがあります。よく使うのは以下の3パターンです。
- そのまま辞書型に変換
- 列を辞書に、行をリストに変換
- index, colums名とdataを分けて辞書に変換
import pandas as pd
df = pd.DataFrame({"a":[1,2,3],"b":[4,5,6],"c":[7,8,9]},
index = list("xyz"))
print(df)
# a b c
# x 1 4 7
# y 2 5 8
# z 3 6 9
d = df.to_dict()
print(d)
# {'a': {'x': 1, 'y': 2, 'z': 3}, 'b': {'x': 4, 'y': 5, 'z': 6}, 'c': {'x': 7, 'y': 8, 'z': 9}}
d_list = df.to_dict(orient='list')
print(d_list)
# {'a': [1, 2, 3], 'b': [4, 5, 6], 'c': [7, 8, 9]}
dic_split=df.to_dict(orient="split")
print(dic_split)
# {'index': ['x', 'y', 'z'], 'columns': ['a', 'b', 'c'], 'data': [[1, 4, 7], [2, 5, 8], [3, 6, 9]]}
dict→pandas
ここまでの説明でも辞書からpandasのデータフレームに変換はいくつか入っていまた。具体的には以下のようになります。
import pandas as pd
dic={'A': [1,2,3], 'B': [4,5,6], 'C': [8,9,10]}
df = pd.DataFrame(dic)
print(df)
# A B C
# 0 1 4 8
# 1 2 5 9
# 2 3 6 10
Numpy⇆PyTorch
numpy→pytorch
numpyからpytorchへの変換には、torch.from_numpy
を利用します
import numpy as np
import torch
data = np.zeros((3, 2, 3))
tdata = torch.from_numpy(data)
pytorch→numpy
pytorchからnumpyへの変換では、numpy
を利用します。
ディープラーニングで利用している場合は、GPU→CPUへの転送とメモリ削減のためにdetach()
を行なっておいた方がよいので、下記の例では合わせて行うようにしています。
import numpy as np
import torch
tensor = torch.zeros((2, 2, 4))
tensor.to('cpu').detach().numpy()
pytorch→list
import torch
tensor = torch.zeros((2, 2, 4))
tensor.to('cpu').tolist()
PIL⇆PyTorch
PIL→pytorch
PILからpytorchへの変換にはtorchvision.transforms.functional.to_tensor
を利用する方法が簡単です。これを利用すると、(H, W, C)の配列の並びが(C, H, W)になり、0~1.0に値が正規化されます。
from PIL import Image
import torchvision
img = Image.open("hoge.jpg")
tensor = torchvision.transforms.functional.to_tensor(img)
pytorch→PIL
pytorchからPILへはtorchvision.transforms.functional.to_pil_image
を利用します。pytorch側のフォーマットは0~1に正規化されていて、(C, H, W)の並びになっている前提になります。
import torch
import torchvision
tensor = torch.zeros((3, 128, 127))
img = torchvision.transforms.functional.to_pil_image(tensor)
PIL⇆Numpy
PIL image→numpy
PILからnumpyへの変換は以下になります。
import numpy as np
from PIL import Image
img = Image.open("img.jpg")
data = np.array(img)
numpy→PIL image
numpyからPILへの変換は以下になります。
import numpy as np
from PIL import Image
data = np.zeros((128, 128, 3))
img = Image.fromarray(np.uint8(data))
PIL⇆OpenCV
PIL image→OpenCV
PILとOpenCVの変換は以下になります。OpenCVへの変換はnumpyへの変換と同じですが、RGBの並びがPILとopenCVで異なるので並び替えも行なっています。
import numpy as np
import cv2
pil_image = Image.open('hoge.jpeg')
cv2_image = np.array(pil_image, dtype=np.uint8)
cv2_image = cv2.cvtColor(cv2_image, cv2.COLOR_RGB2BGR)
OpenCV→PIL image
OpenCVからPILへの変換は、numpyと同じです。こちらも同様にRGBの並び替えを(事前に)行なっています。
from PIL import Image
import cv2
cv2_image = cv2.imread('hoge.jpeg')
cv2_image = cv2.cvtColor(cv2_image, cv2.COLOR_BGR2RGB)
pil_image = Image.fromarray(cv2_image)
OpenCV⇆PyTorch
OpenCVはnumpyのフォーマットなので、「PyTorch⇆Numpy」と同じ処理で変換可能です
画像データの場合OpenCVではH, W, Cの順ですが、PytorchではC, H, Wの順なので並べ替えが必要
torchの場合は以下のようにします
dat.permute(1,2,0)
まとめ
Pandas, numpy, pytorch, PIL, openCVの相互変換について、ざっと説明しました。このあたりのデータ変換は頻繁に行いますので、メモとして残しておきます。