# ワンホットから整数への変換
:::{container} prog-cpp
**ワンホットベクトル** とは,ちょうど1つの要素が1で残りがすべて0のバイナリベクトルです.
1の位置が整数値を符号化します.
例えば,$\{0,0,1,0\}$ は整数2を表します.
グローバル関数 **`qbpp::onehot_to_int()`** は整数配列中のワンホット符号化された行をデコードし,
1の位置を示す整数配列を返します.
### 基本的な使い方(2次元配列)
サイズ $n \times m$ の2次元配列の場合,`onehot_to_int()` は各行をデコードし,
$[0, m-1]$ の範囲の $n$ 個の整数からなる1次元配列を返します.
行が有効なワンホットベクトルでない場合(つまり,ちょうど1つの1を含まない場合),
その行に対して $-1$ を返します.
```{literalinclude} /../programFiles/cppPrograms/advanced/onehot-integer-program1.cpp
:language: cpp
:caption: onehot-integer-program1.cpp
```
このプログラムは $5 \times 5$ の置換行列を定義し,それを順列にデコードします:
```{include} /../programFiles/markDown/advanced/onehot-integer.md
:start-after:
:end-before:
```
### 軸の指定
デフォルトでは,`onehot_to_int()` は最後の軸(`axis=-1`)に沿ってデコードします.
**`onehot_to_int(arr, axis)`** で任意の軸を指定できます.
負のインデックスもサポートされています: 軸 `-1` は最後の軸,`-2` は最後から2番目の軸を指します.
サイズ $n \times m$ の2次元配列の場合:
- **`onehot_to_int(arr)`** または **`onehot_to_int(arr, 1)`**: 各行をデコード,$[0, m-1]$ の $n$ 個の整数を返す.
- **`onehot_to_int(arr, 0)`**: 各列をデコード,$[0, n-1]$ の $m$ 個の整数を返す.
```{include} /../programFiles/markDown/advanced/onehot-integer.md
:start-after:
:end-before:
```
`x` が置換行列の場合,`onehot_to_int(sol(x))` は順列 $\sigma$ を,
`onehot_to_int(sol(x), 0)` はその逆順列 $\sigma^{-1}$ を返します.
### 1次元入力
サイズ $m$ の1次元配列の場合,`onehot_to_int()` は単一の整数(1の位置)を返します.
入力が有効なワンホットベクトルでない場合は $-1$ を返します.
```{include} /../programFiles/markDown/advanced/onehot-integer.md
:start-after:
:end-before:
```
### 高次元配列
次元 $d \geq 3$ の配列の場合,`onehot_to_int()` は指定された軸に沿ってデコードし,
次元 $d - 1$ の配列を返します.
例えば,$2 \times 3 \times 4$ の配列の場合:
- **`onehot_to_int(arr)`** または **`onehot_to_int(arr, 2)`**: 軸2(最後)に沿ってデコード,結果の形状 $2 \times 3$.
- **`onehot_to_int(arr, 1)`**: 軸1に沿ってデコード,結果の形状 $2 \times 4$.
- **`onehot_to_int(arr, 0)`**: 軸0に沿ってデコード,結果の形状 $3 \times 4$.
### まとめ
| 入力形状 | 軸 | 出力形状 | 値の範囲 |
|------------------|------|--------------|---------------|
| $(m)$ | — | スカラー | $[0, m-1]$ または $-1$ |
| $(d_0 \times \cdots \times d_{n-1})$ | $k$ | $d_k$ を除く全次元 | $[0, d_k-1]$ または $-1$ |
:::
:::{container} prog-python
**ワンホットベクトル** とは,ちょうど1つの要素が1で残りがすべて0のバイナリベクトルです.
1の位置が整数値を符号化します.
例えば,`[0, 0, 1, 0]` は整数2を表します.
グローバル関数 **`qbpp.onehot_to_int()`** は整数配列中のワンホット符号化された行をデコードし,
1の位置を示す整数配列を返します.
### 基本的な使い方(2次元配列)
サイズ $n \times m$ の2次元配列の場合,`onehot_to_int()` は各行をデコードし,
$[0, m-1]$ の範囲の $n$ 個の整数からなる1次元配列を返します.
行が有効なワンホットベクトルでない場合(つまり,ちょうど1つの1を含まない場合),
その行に対して $-1$ を返します.
```{literalinclude} /../programFiles/pythonPrograms/advanced/onehot-integer-program1.py
:language: python
:caption: onehot-integer-program1.py
```
このプログラムは $5 \times 5$ の置換行列を定義し,それを順列にデコードします:
```{include} /../programFiles/markDown/advanced/onehot-integer.md
:start-after:
:end-before:
```
### 軸の指定
デフォルトでは,`onehot_to_int()` は最後の軸(`axis=-1`)に沿ってデコードします.
**`onehot_to_int(arr, axis)`** で任意の軸を指定できます.
負のインデックスもサポートされています: 軸 `-1` は最後の軸,`-2` は最後から2番目の軸を指します.
サイズ $n \times m$ の2次元配列の場合:
- **`onehot_to_int(arr)`** または **`onehot_to_int(arr, axis=1)`**: 各行をデコード,$[0, m-1]$ の $n$ 個の整数を返す.
- **`onehot_to_int(arr, axis=0)`**: 各列をデコード,$[0, n-1]$ の $m$ 個の整数を返す.
```{include} /../programFiles/markDown/advanced/onehot-integer.md
:start-after:
:end-before:
```
`x` が置換行列の場合,`onehot_to_int(sol(x))` は順列 $\sigma$ を,
`onehot_to_int(sol(x), axis=0)` はその逆順列 $\sigma^{-1}$ を返します.
### 1次元入力
サイズ $m$ の1次元配列の場合,`onehot_to_int()` は1の位置を含む単一要素配列を返します.
入力が有効なワンホットベクトルでない場合は $-1$ を返します.
```{include} /../programFiles/markDown/advanced/onehot-integer.md
:start-after:
:end-before:
```
### 高次元配列
次元 $d \geq 3$ の配列の場合,`onehot_to_int()` は指定された軸に沿ってデコードし,
次元 $d - 1$ の配列を返します.
例えば,$2 \times 3 \times 4$ の配列の場合:
- **`onehot_to_int(arr)`** または **`onehot_to_int(arr, axis=2)`**: 軸2(最後)に沿ってデコード,結果の形状 $2 \times 3$.
- **`onehot_to_int(arr, axis=1)`**: 軸1に沿ってデコード,結果の形状 $2 \times 4$.
- **`onehot_to_int(arr, axis=0)`**: 軸0に沿ってデコード,結果の形状 $3 \times 4$.
### まとめ
| 入力形状 | 軸 | 出力形状 | 値の範囲 |
|------------------|------|--------------|---------------|
| $(m)$ | — | $(1)$ | $[0, m-1]$ または $-1$ |
| $(d_0 \times \cdots \times d_{n-1})$ | $k$ | $d_k$ を除く全次元 | $[0, d_k-1]$ または $-1$ |
:::