transport opsignal × signal → transport_planimport fullseye as fs; fs.ledger.transport_plan_1d(u_values, v_values) (実装を直接呼ぶなら import colortransport; colortransport.transport_plan_1d(u_values, v_values)、台帳から引くなら opscolortransport.get("transport_plan_1d"))1 次元の厳密な輸送計画(北西隅則)。(n, m) の質量行列を返す。
行和が 1/n、列和が 1/m になる ―― これは構成上厳密で、
数値誤差以外でずれることはない(テストで固定)。
手順: u(n 個)と v(m 個)をそれぞれ昇順に並べ、小さいほうから
順に質量 min(残り u, 残り v) を割り当てる(単調な結合)。各標本の質量は
等しく 1/n、1/m(重み付きは受けない)。1 次元では距離の凸関数を
コストとする限りこの単調結合が最適解なので、wasserstein_1d と同じ
輸送を「どの標本がどこへ行くか」の行列として得られる。
u_values, v_values: 1 次元に潰す(ravel)。長さは違ってよい。
空なら MetricContractError。有限性は検査しない(NaN はソートで末尾に
回り、黙って結合される)。(n, m) の float64(transport_plan 型)。plan[i, j] は入力の
元の並びで u[i] から v[j] へ運ぶ質量。非零要素は高々 n + m - 1。
n == m なら置換行列 / n(一対一対応)。O((n + m) log) のソート + O(n + m) の走査だが、返す行列は
n × m の密行列なので画素数規模の標本には向かない(その場合は
histogram_match か sinkhorn)。apply_transport(plan, v) で u 側の各標本の行き先の値(重心)を、
transport_cost(plan, cost) で総コストを取る。
py -3.11 examples/color_transport.pytransport_plan を入力に取れる)transport_cost · apply_transport
transport)wasserstein_1d · sinkhorn · sinkhorn_distance · sinkhorn_divergence
Provenance: colortransport.py — COLORTRANSPORT operator registry. この per-op ノートは tools/opdocs.py md が自動生成(手編集しない)。
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.