Posted at

LINQってNumpyに似てる!


はじめに

最近、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]