Python numpyの基本 配列の計算

Python学習【365日チャレンジ!】317日目のマスターU(@Udemy11)です。

クリスマスイブですね〜!

コロナのせいで人では例年より少ないとはいえ、恋人たちには関係ないんでしょうね。

4月に緊急事態宣言を出したときに比べて、何倍の感染者になってるのかわかりませんが、こんな状態でも緊急事態宣言を出さないということは、政府が、これを気に高齢者の数を減らしたいと考えてるのではないかと思えても仕方がありません。

ほんとこの先どうなっていくんでしょう?

自粛はチャンスと捉えて、自己研鑽でスキルを磨きましょう!

ということで、今日もPython学習を始めますよ。

昨日の復習

昨日は、複数の配列を使った演算について学習しました。

列の数が同じなら、複数の配列を使って四則演算をすることができました。

割り算については、0で割ることができないので、注意が必要ですが、演算子=を使うことで、配列の値を上書きすることもできました。

いろいろ試してみることが大切ですので、いろいろと試して経験値をアップさせましょう。

くわしくは、昨日の記事を参照してください。

今日は、randamを使った配列や行列の入れ替え操作などについて学習します。

random

randomは、0から1の間で任意の値を配列にできるメソッドです。

import numpy as np
np.random.random((2, 3))
# array([[0.95367176, 0.44611864, 0.45904239],
#        [0.61164295, 0.82608661, 0.25361573]])

np.random.ranf((2, 3))
# array([[0.00744201, 0.18533881, 0.03274229],
#        [0.85827874, 0.50345242, 0.36198251]])

np.random.sample((2, 3))
# array([[0.28036025, 0.96709082, 0.84582569],
#        [0.33677406, 0.23364462, 0.57108953]])

np.random.random_sample((2, 3))
# array([[0.24652542, 0.03436601, 0.85997402],
#        [0.02532444, 0.9086837 , 0.19519088]])

np.random.rand(2, 3)
# array([[0.58809668, 0.7462008 , 0.89225268],
#        [0.1646393 , 0.65508032, 0.24908963]])

randomsampleranfはすべてrandom_sampleのエイリアスで、すべて同じ使い方ができます。

同じものがそんなに必要なのか疑問ですが、Pythonの開発段階でまとめたのかもしれませんね。

最後のrandも同じ使い方ができますが、違いは、random_sampleが、Parenthesesの丸括弧でくくったタプルで値を渡すのに対して、randは、数値をそのまま代入しているので、Parenthesesの丸括弧が一つ少なくなっています。

sum()

sumは合計ですね。

a = np.random.rand(2, 3)
a
# array([[0.83670122, 0.50292842, 0.03355007],
#        [0.22862364, 0.81227643, 0.95654644]])

a.sum()
# 3.3706262238688165

max()

maxは最大値です。

a.max
# 0.95654644

min()

minは最小値です。

a.min
# 0.03355007

mean()

meanは平均値です。

a.mean()
# 0.5617710373114694

randint

ranintは、任意の整数の範囲からランダムに値を抽出するメソッドです。

np.random.randint(0, 10)
# 2

np.random.randint(0, 10, 3)
# array([3, 8, 8])

np.random.randint(0, 10, (2, 3))
# array([[3, 3, 7],
#        [1, 9, 7]])

引数で範囲を指定すれば、ランダムに選ばれた値が抽出されます。

第3引数に数値を指定すれば、その数だけランダムな値が入った配列が返されます。

第3引数にタプルで行列の数を指定すれば、ランダムに選ばれた数で構成された行列の配列が作成されます。

axis

axisは、sumなどの計算をする時に、配列の計算を行方向か列方向の指定をする引数です。

b = np.random.randint(0, 12, (3, 4))
b
# array([[ 5,  4,  1,  4],
#        [ 9,  6,  1,  2],
#        [ 9,  4, 11,  1]])

b.min(axis=0)
# array([5, 4, 1, 1])

b.min(axis=1)
# array([1, 1, 1])

ランダムな数字で3行4列の配列bを作成して、最初は、axis=0で列の中で最小値を探しています。

次はaxis=1で行の中の最小値を探しています。

axisは、minだけでなくmaxsumなどでも使うことが可能です。

T

キャピタル(大文字)のTは、行列を入れ替えることができます。

c = np.arange(12).reshape(3, 4)
c
# array([[ 0,  1,  2,  3],
#        [ 4,  5,  6,  7],
#        [ 8,  9, 10, 11]])

c.T
# array([[ 0,  4,  8],
#        [ 1,  5,  9],
#        [ 2,  6, 10],
#        [ 3,  7, 11]])

3行4列の配列cを作って、c.Tで行列を入れ替えています。

resize

いま作成した配列cは3行4列ですが、これを2行6列に変更できるのがresizeです。

c.resize((2, 6))
c
# array([[ 0,  1,  2,  3,  4,  5],
#        [ 6,  7,  8,  9, 10, 11]])

配列に入っている値の数が12なので、12が割り切れる数でないとエラーが起こるので、例えば(2, 5)で2行5列にリサイズしようと思ってもできないということです。

まとめ

Numpyの配列について、いろいろな使い方を学習してきましたが、エクセルの元になっているのがこれらのプログラムなのかと考えると、ビジュアルのイメージとコードが繋がって理解が深まっていきます。

エクセルでも配列計算はできるのですが、いまいち理解できていなかったので、今回学習したことで、エクセルでも配列関数を扱っていこうと思います。

アプリケーションのもとは、プログラムなので、その根本的なところを学習するのは、ある意味パズルを解いていくような快感を感じるのですが、これが苦痛な人はプログラミングに向いてないかもしれませんね。

幸いながら!?私は、読み解く、紐解くという快感を感じているので、Pythonの深みにハマっていこうと思います。

Pythonの深みにハマりたい方には酒井さんの講座がおすすめです。

Udemy講師 酒井さん プログラミング Python

それでは、明日もGood Python!