はじめに
最近、C#を勉強し始め、LINQに出会ったのですが、「これPythonのNumpyに似てる!」と思ったので、自分の頭の整理も兼ねて実装を比較してみます。
参考にさせて頂いたページ
実装の比較
処理内容毎にLINQの実装、Numpyの実装の順に書いています。
配列の作成
Sample.cs
var arr = Enumerable.Range(0, 6);
Console.WriteLine(string.Join(" ", arr));
// 0 1 2 3 4 5
Sample.py
arr = np.arange(6)
print(arr)
# [0 1 2 3 4 5]
Sum
Sample.cs
Console.WriteLine(arr.Sum());
// 15
Sample.py
print(arr.sum())
# 15
Max
Sample.cs
Console.WriteLine(arr.Max());
// 5
Sample.py
print(arr.max())
# 5
Sort(降順)
Sample.cs
var arr2 = arr.Reverse();
Console.WriteLine(string.Join(" ", arr2));
// 5 4 3 2 1 0
Sample.py
arr.sort()
print(arr[::-1])
# [5 4 3 2 1 0]
末尾の要素を取得
Sample.cs
Console.WriteLine(arr.Last());
// 5
Sample.py
print(arr[-1])
# 5
部分配列を取得
Sample.cs
var arr3 = arr.Skip(1).Take(3);
Console.WriteLine(string.Join(" ", arr3));
// 1 2 3
Sample.py
print(arr[1:-2])
# [1 2 3]
条件指定で部分配列を取得
Sample.cs
var arr4 = arr.Where(x => x % 2 == 0);
Console.WriteLine(string.Join(" ", arr4));
// 0 2 4
Sample.py
print(arr[arr % 2 == 0])
# [0 2 4]
加工
Sample.cs
var arr5 = arr.Select(x => x * x);
Console.WriteLine(string.Join(" ", arr5));
// 0 1 4 9 16 25
Sample.py
print(arr * arr)
# [ 0 1 4 9 16 25]
複数のシーケンスをまとめてループ
Sample.cs
var arr6 = arr;
var arr7 = arr.Zip(arr6, (a1, a6) => a1 + a6);
Console.WriteLine(string.Join(" ", arr7));
// 0 2 4 6 8 10
Sample.py
arr2 = arr
arr3 = np.array([], dtype=np.int32)
for a1, a2 in zip(arr, arr2):
arr3 = np.append(arr3, a1 + a2)
print(arr3)
// [ 0 2 4 6 8 10]