どうも!僕です!
つか〇です!
最近,データ分析に興味が出てきて,Pythonの勉強をしております.
Pythonにおいて,データ分析に欠かせないとされているのが,「Numpy」です.
これからしばらくの間,つか〇の備忘録的にNumpyについて説明していきたいと思います.
初回は,「NumPyってなんぞや?」からです.
コンパクトにまとめつつ,わかりやすくしていきたいと思います.
NumPyとは?
NumPyで何ができるかというと,「多次元配列を高速にできる」ことが主なのかなと思っています.
Pythonには,リストという配列があります.
リストには,整数や実数,文字列などのデータを複数個格納できます.
「じゃあ,Numpyとリストで何が違うの?」
という疑問が浮かびますよね?
つか〇は正直わかりませんでした.
いろいろ違いはあると思いますが,大きな違いとしては,Numpyはリストと異なり,「for文でのループ」を必要としないことが大きいかなと思っています.
その結果,演算が高速になります.
実際に見てみましょう!
まず,NumPyとリストで5,000,000の整数を持つ配列を作ります.
(※NumPyは,pipでインストールしました.今後どっかで変わるかもです.)
#NumPy での配列作成
import numpy as np
arr1 = np.arange(5000000)
#リストの配列作成
list1 = list(range(5000000))</code></pre>
これでどちらも[0, 1, 2, ・・・,4999999]の配列ができます.
次に,この二つの配列の要素すべてに2を掛けた時の時間を表示します.
まずは,NumPyの配列です.
%time for _ in range(10): arr2 = arr1 * 2
Wall time: 158 ms
つか〇のPCスペックでは,このような時間にかかりました.
続いて,リストでの計算時間を見てみます.
%time for _ in range(10): list2 = [x * 2 for x in list1]
Wall time: 5.51 s
つか〇のスペックでは5.51 secもかかりました.
二つの配列の時間を比較すると,35倍近く早いことがわかります.
ちなみに時間を計測したコードも比較すると,NumPyでの配列は直接2を掛けたのに対して,リストではfor文を書くことですべての要素に2を掛けていることがわかります.
そのため,処理時間に差が出ていることがわかります.
また,このことから,いちいちfor文で読み出す作業がないため,メモリ量も格段に少なく済むらしいです.
これは,扱うデータ量が多くなるデータサイエンスにとってはもってこいですね.
じゃんじゃん使って,マスターする必要がありそうです.
ndarray
上記の高速かつ大規模データ処理を可能にしているのは,「ndarray」という多次元配列オブジェクトのおかげです.
前節では,NumPy配列の中身に触れませんでしたが,ここで具体的に触れていきたいと思います.
前節同様,NumPyをインポートしてから,乱数の配列を作成します.
(乱数の配列の作成のメソッドはこんなもんだ程度に流してください.)
import numpy as np
#乱数配列の作成
random_data = np.random.randn(3, 5)
random_data
array([[-0.32586837, -3.20776859, 0.5855585 , -1.61616979, -1.49281806],
[-0.63032418, -0.15505281, -0.47460229, -0.12900111, -0.21821642],
[ 0.4603417 , 0.22211617, -0.46915454, 1.40775476, -1.91974718]])
3行5列の配列の各要素に適当な数値を格納しています.
この配列の型も見てみましょう.
type(random_data)
numpy.ndarray
「NumPy」の「ndarray」であることがわかりました.
これで,ndarrayの作成は完了しました.
では,この配列を使って算術演算を行ってみましょう.
前項の通り,ndarrayでは,リストと異なり,for文を使わずに各要素ごとに算術演算子を用いた計算ができます.
data_multi = random_data * 5
data_plus = random_data + random_data
print("data_multi", data_multi)
print("data_plus", data_plus)
data_multi [[ -1.62934185 -16.03884294 2.92779251 -8.08084894 -7.46409032]
[ -3.15162092 -0.77526403 -2.37301145 -0.64500557 -1.09108211]
[ 2.30170849 1.11058087 -2.34577269 7.03877379 -9.59873589]]
data_plus [[-0.65173674 -6.41553718 1.171117 -3.23233957 -2.98563613]
[-1.26064837 -0.31010561 -0.94920458 -0.25800223 -0.43643284]
[ 0.9206834 0.44423235 -0.93830908 2.81550951 -3.83949436]]
それぞれ各要素ごとに計算されていることがわかります.
ndarrayの特徴
前項でndarrayの計算について説明しました.
それ以外の大きな特徴としては,ndarrayの各要素はすべて同じ型でなければなりません.
ndarray配列の型を確認するには「dtype」を使います.
random_data.dtype
dtype('float64')
このように型がわかると,
「random_dataには,float64の型の要素で構成されているから,float64型で追加,編集しないとだめだな」
ということがわかります.
型についての説明は省略します.
どこかで説明できればと思いますので,それまでは,自力で調べましょう!!
(急に投げやりですみません(笑).)
また,配列のサイズ,配列の要素数を「shape」を使って確認することができます.
random_data.shape
(3, 5)
3行の配列にそれぞれ5つの要素が入っていることを示しています.
上記で作成,確認したものと同じですね.
これをすることで,何個のデータがあるのか,何行何列か,内積求められるかとかいろいろの検討ができますね.
まとめ
今回は,NumPyの基礎,ndarrayについての紹介をしました.
つか〇の愛読書,「Pythonによるデータ分析入門」から学び取った内容です.
元々,海外のもので日本語訳バージョンを買いましたが,少し難しい翻訳等がありましたので,つか〇的翻訳をしました.
ただ,内容としては一級品で学べば楽しいです.
ぜひ手に取ってみてみてください!
正直本記事だけだと,初心者にとってはあまり必要性が感じられないかもしれません.
つか〇もそうでした.
今後,楽しくなるように紹介できればと思います.
頑張ります.
以降の記事で,NumPyの配列,ndarrayの基礎的な扱い,インデックス参照とスライスについて説明していますので,ぜひ参考にしてください.
一緒に頑張りましょう!!
コメント