この記事は、Elixir Advent Calendar 2023 シリーズ11 の18日目です
【本コラムは、5分で読め、4分で試せます】
piacere です、ご覧いただいてありがとございます
たとえば、
%{
a: [nil, 2.0, 3.0],
b: [0.9, nil, 3.3]
}
というデータを、
[
%{a: nil, b: 0.9},
%{a: 2.0, b: nil},
%{a: 3.0, b: 3.3}
]
という感じに回転させたいとき、ありませんか?
そういうシーンで困らないようにTIPSとしてまとめておきました … Elixirの様々な書き方のトレーニングにもなると思います
リスト内リストを回転
[
[nil, 2.0, 3.0],
[0.9, nil, 3.3]
]
|> Enum.zip
|> Enum.map(& Tuple.to_list(&1))
結果
[
[nil, 0.9],
[2.0, nil],
[3.0, 3.3]
]
マップのリスト値をリスト内マップに回転
then
を挟むことで、入力データを、「マップのリスト値の回転」と「マップキーのzip」の両方に &1
で渡せるようにしている点がテクニックです
%{
a: [nil, 2.0, 3.0],
b: [0.9, nil, 3.3]
}
|> then(&
Enum.map(
Map.values(&1) |> Enum.zip,
fn row -> Enum.into(List.zip([Map.keys(&1), row]), %{}) end))
結果
[
%{a: nil, b: 0.9},
%{a: 2.0, b: nil},
%{a: 3.0, b: 3.3}
]
リスト内マップからマップのリスト値に回転
[
%{a: nil, b: 0.9},
%{a: 2.0, b: nil},
%{a: 3.0, b: 3.3}
]
|> Enum.reduce(%{}, &
Enum.reduce(&1, &2, fn {k, v}, acc ->
Map.update(acc, k, [v], fn n -> n ++ [v] end) end))
結果
%{
a: [nil, 2.0, 3.0],
b: [0.9, nil, 3.3]
}
Nxテンソルを回転
[
[1, 2, 3],
[9, 8, 7]
]
|> Nx.tensor
|> Nx.transpose
結果
#Nx.Tensor<
s64[3][2]
EXLA.Backend<host:0, 0.1373024662.28180512.24755>
[
[1, 9],
[2, 8],
[3, 7]
]
>