Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

NumPy 連携

rsshogi.numpy

NumPy と連携するための dtype 定義を提供します。 学習データの効率的な処理に使用できます。

from rsshogi.numpy import (
    PackedSfen,
    PackedSfenValue,
    HuffmanCodedPos,
    HuffmanCodedPosAndEval,
)

注意: NumPy がインストールされていない場合、このモジュールは利用できません。

dtype 一覧

PackedSfen

圧縮された局面データ(32 バイト)を格納する dtype です。

import numpy as np
from rsshogi.numpy import PackedSfen

# 配列の作成
data = np.zeros(100, dtype=PackedSfen)
print(data.dtype)  # => dtype([('sfen', 'u1', (32,))])

フィールド

フィールドサイズ説明
sfenuint832圧縮された局面データ

PackedSfenValue

局面データと評価値などの付加情報を含む dtype です。 学習データとして使用されます。

import numpy as np
from rsshogi.numpy import PackedSfenValue

# 配列の作成
data = np.zeros(100, dtype=PackedSfenValue)
print(data.dtype)

フィールド

フィールドサイズ説明
sfenuint832圧縮された局面データ
scoreint161評価値(センチポーン)
moveuint161指し手(16bit エンコーディング)
game_plyuint161手数
game_resultint81対局結果
paddinguint81パディング

HuffmanCodedPos

cshogi / Apery 互換の HCP 局面(32 バイト)を格納する dtype です。

import numpy as np
from rsshogi.numpy import HuffmanCodedPos

data = np.zeros(100, dtype=HuffmanCodedPos)
print(data.dtype)  # => dtype([('hcp', 'u1', (32,))])
フィールドサイズ説明
hcpuint832HuffmanCodedPos バイト列

HuffmanCodedPosAndEval

hcpe 学習データ 1 件分(38 バイト)を格納する dtype です。

import numpy as np
from rsshogi.numpy import HuffmanCodedPosAndEval

data = np.zeros(100, dtype=HuffmanCodedPosAndEval)
print(data.dtype)
フィールドサイズ説明
hcpuint832HuffmanCodedPos バイト列
evalint161評価値
bestMove16uint161Apery 16bit 指し手
gameResultint81Draw / BlackWin / WhiteWin
dummyuint81パディング

使用例

Board との連携

import numpy as np
from rsshogi.core import Board
from rsshogi.numpy import PackedSfen

board = Board()
board.apply_usi("7g7f")

# 局面を PackedSfen 形式で取得
psfen_bytes = board.to_packed_sfen()

# NumPy 配列として格納
data = np.zeros(1, dtype=PackedSfen)
data[0]['sfen'] = np.frombuffer(psfen_bytes, dtype=np.uint8)

学習データの読み込み

import numpy as np
from rsshogi.numpy import PackedSfenValue

# バイナリファイルから読み込み
with open("training_data.bin", "rb") as f:
    data = np.frombuffer(f.read(), dtype=PackedSfenValue)

print(f"データ数: {len(data)}")
print(f"平均評価値: {data['score'].mean():.1f}")

hcpe の読み込み

import numpy as np
from rsshogi.core import Board
from rsshogi.numpy import HuffmanCodedPosAndEval

entries = np.fromfile("teacher.hcpe", dtype=HuffmanCodedPosAndEval)

board = Board()
board.set_hcp(entries[0]["hcp"])
print(entries[0]["bestMove16"])
print(entries[0]["eval"])

学習データの作成

import numpy as np
from rsshogi.core import Board
from rsshogi.numpy import PackedSfenValue

# 棋譜から学習データを作成
data = np.zeros(100, dtype=PackedSfenValue)

board = Board()
for i, usi_move in enumerate(usi_moves[:100]):
    # 局面を保存
    psfen = board.to_packed_sfen()
    data[i]['sfen'] = np.frombuffer(psfen, dtype=np.uint8)
    data[i]['score'] = eval_scores[i]
    data[i]['move'] = move_values[i]
    data[i]['game_ply'] = i + 1
    data[i]['game_result'] = result
    
    board.apply_usi(usi_move)

# ファイルに保存
data.tofile("training_data.bin")

hcpe の作成

import numpy as np
from rsshogi.core import Board
from rsshogi.numpy import HuffmanCodedPosAndEval

board = Board()
data = np.zeros(1, dtype=HuffmanCodedPosAndEval)
board.to_hcpe(best_move="7g7f", score=120, game_result="BLACK_WIN", out=data)
data.tofile("teacher.hcpe")

関連項目

  • Board - 盤面管理クラス(to_packed_sfen(), to_hcp(), to_psv(), to_hcpe(), set_packed_sfen(), set_hcp()
  • Apery / hcpe 互換 - AperyMove / AperyMove32 と HCP/HCPE の概要
  • Record - 棋譜レコード(to_sbinpack(), from_sbinpack(), to_psv()