プログラミング
記事内に商品プロモーションを含む場合があります

データ変換チートシート:Pandas, Numpy, PyTorch, PIL, OpenCV

tadanori

PandasとNumpy, NumpyとPytorch, 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()

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の相互変換について、ざっと説明しました。このあたりのデータ変換は頻繁に行いますので、メモとして残しておきます。

おすすめ書籍

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

記事URLをコピーしました