最近、プログラミングでよく聞くNumPyって、正直ちょっと苦手かも…って思うことがあったんだよね💭
「なんでこんなに複雑なんだろ?」って感じる人もいると思うし、わたしもまさにそうだったから。
今回は、そんなNumPyのもやもやポイントを、気楽に話してみるよ✨
NumPyって何?ちょっとだけおさらい🔧
ざっくり言うと、Pythonで数字を扱うときにすごく便利なツールなんだよね。
いろんな計算を早くできるし、データ分析や機械学習でも大活躍✨
でも、便利だからって誰でもすぐ使いこなせるわけじゃないのが実情かも🥺
なんで苦手に感じるの?理由はコレかも👀
-
見た目がちょっと怖い
普通のPythonのリストや数字と違って、NumPyは「配列」っていう特別な形をしてるの。
これが最初はパッと見でわかりにくくて、ややこしいな〜って思いやすい💭 -
エラーが分かりにくい
数字の形とか型(データ型)が合わないとすぐにバグになるけど、
エラーメッセージが初心者には何言ってるの?って感じだったりするのよ😵💫 -
ドキュメントがちょっと専門的
公式の説明は充実してるけど、難しい言葉が多くて読むのが大変だったり…💦
でも、それでも使われ続ける理由って?💡
それはやっぱり、処理の速さと便利さがあるから。
例えば大量のデータを扱うときは、普通のPythonよりNumPyを使うほうがスムーズに動くんだよね。
だから、「ちょっと苦手だけど、頑張って慣れようかな」ってなる人が多いのも納得できるかな〜って感じ🥺
どうしたらもう少し楽に付き合える?おすすめポイント✨
-
周りに聞く・調べるを繰り返す
わからないことは放置せず、調べたり人に聞いたりしたほうが意外と近道だったりするよ🍓 -
小さいコードから試してみる
いきなり大きなデータとか複雑な処理をやろうとせず、
簡単な計算から慣れていくのがオススメ💗 -
エラーメッセージは怖がらない
最初は意味が分からなくても、検索すれば似たような悩みを持つ人がいっぱいいるんだよね。
少しずつ慣れていこう👀
なんとなく使い始めても、NumPyは慣れるまでにちょっと距離を感じちゃうツールかも。
でも、使いこなせるようになると便利さがグッと増すから、焦らず自分のペースでトライしてみてほしいなって思うよ💭✨
コメント
ロバート
好き嫌いは置いといて、MatlabやNumPyのベクトルAPIは慣れが必要で、特に3次元以上の`einsum`や`tensordot`は数式の説明コメントがないと分かりにくいよね。
ハンナ
C++の単純ループも3次元以上や複数処理があると読みづらくてコメント必須だから、ループが万能とは限らないんだよね。 数学とコードの繋がりを伝えるのが難しい。
キンバリー
`linalg.solve`のドキュメントは結構分かりやすいし、ブロードキャストの場所も説明されてるから、`for i, j, k...`みたいに好きにループできるのが助かる。 `None`の代わりに`np.newaxis`使うともっと見やすいよ。
マックス
NumPyは大好きだけど、一番のネックはコードじゃなくてドキュメントなんだよね。
サラ
あちこち不明瞭か不完全で、特に`np.einsum`は便利だけど説明が足りなくて使いこなすのに苦労したよ。
ノーラン
BQN使えば? 本物の(男女問わず)プログラマーならね。
エイダン
これくらいシンプルなコードを、 ```python D = np.zeros((K,N)) for k in range(K): for n in range(N): a = A[k,:,:] b = B[:,n] c = C[k,:] D[k,n] = np.mean(a * b[:,None] * c[None,:]) ``` こっちみたいに一行で済むんだよ。
エマ
``` D ← (+´˘∘⥊˘) (A ע ⌽˘⟜B ע˘ C) ``` 読みやすいし、プリントアウトもめっちゃ節約できる。
クロエ
数学にはPythonよりJulia使いたいなあ。
サム
Python好きじゃない。
クリス
こっちは続編の記事で、新しい文法とパッケージを提案してるよ:https://dynomight.net/dumpy/
レオ
`einsum`最高! 神に感謝だね。
リリー
OPが本当に欲しいのはラベル付き次元でわかりやすいxarrayだよ:https://docs.xarray.dev/en/stable/
クリス
大きい処理ならPythonのループコストは相殺されるし、小さい処理だと`einsum`の解析コストが大きいから、事前に解析済みを渡せないのは痛い。 OPへの反論じゃなく、覚えておくべきポイントね。
サム
どっちが正解? 質問直後に話題変わってるし。
ハンナ
OP、あなたが投稿者? フォントが細すぎてコード読めないよ(薄いグレーで1ピクセル線みたい)。 直してくれない?
ノーラン
``` y = linalg.solve(A[:,:,:,None],x[:,None,None,:]) ``` これ、めちゃくちゃ見づらいね。 Pythonどうしちゃったの? 昔はもうちょいマシだったのに。
ミア
肝心なポイントが抜けてる気がするよ。 ずっと「ループ使いたいけど使えない」って話だけど、ここで必要なのは並列ループの概念だよ。
ミア
例えば`for i in range(1000)`を並列に1000個のソルバーへ投げるような仕組み。
ミア
ループがダメなのは逐次実行で遅いからで、その理由は66回目の結果が67回目に影響するから。 だからループっぽいけど外部に影響を与えない制限付きの並列ループが必要で、それは慎重に実装しないとね。