LoginSignup
9
1

【TIPS】データの回転

Last updated at Posted at 2023-12-18

この記事は、Elixir Advent Calendar 2023 シリーズ11 の18日目です


【本コラムは、5分で読め、4分で試せます】

piacere です、ご覧いただいてありがとございます :bow:

たとえば、

%{
  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]
  ]
>
9
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
1