読者です 読者をやめる 読者になる 読者になる

pythonの基礎とNumpy

python

pythonはとても便利なのですが、どうも関数や書き方がイマイチ身についていないので、メモ書きをしておきます。
便利な機能いろいろ

listのいろいろ
初期化

>>> list = []

値の追加(C++でいうvectorのpushback)

>>> list.apend(10)

一個飛ばしで取得

>>> vec[start:end:step]

max/minのindexの取得

>>> x = [2, 3, 0, 1]
>>> max_idx = x.index(max(x))
>>> min_idx = x.index(min(x))

スライスによる部分リストの取得

>>> x = [2, 3, 1, 0, 4]
>>> slice1 = x[1:2]  #[3]
>>> slice2 = x[1:-1] #[3, 1, 0]
>>> slice3 = x[2:]   #[1, 0, 4]
>>> slice4 = x[:2]   #[2, 3]

for文の内包表記

>>> list = [x ** 2 for x in range(10)
>>> print(list)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

ベクトルとスカラーの計算

>>> vector = np.arange(10)
>>> scalar = 2
>>> result = vector * scalar
>>> print(result)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

行、列の抽出

  • 行の抽出
>>> X = [[ 0,  1,  2,  3,  4], 
         [ 5,  6,  7,  8,  9], 
         [10, 11, 12, 13, 14],
         [15, 16, 17, 18, 19],
         [20, 21, 22, 23, 24]]
>>>print X[1]
[5, 6, 7, 8, 9]
>>>print X[1,]
[5, 6, 7, 8 ,9]
>>>print X[1,:]
[5, 6, 7, 8, 9]
  • 列の抽出
>>> print X[:,1]
[1, 6, 11, 16, 21]

listとtuple

>>> list = [0, 1, 2]
>>> tuple = (0, 1, 2)

listは値を変更可能だが、tupleは変更不可能である。

ループの方法

  • 方法1
>>> X = ['ita', 'zuri', 'taka', 'hiro']
>>> for i in range(len(X)):
...   print(i, X[i])
...
0 ita
1 zuri
2 taka
3 hiro
  • 方法2(enumerate関数)
>>> X = ['ita', 'zuri', 'taka', 'hiro']
>>> for i, x in enumerate(X):
...   print(i, x)
...
0 ita
1 zuri
2 taka
3 hiro
>>> import numpy as np
>>> X = np.array([['ita', 'zuri'], ['taka', 'hiro']])
>>> it = np.nditer(X, flags=['multi_index'], op_flags=['readwrite'])
>>> while not it.finished:
...   idx = it.multi_index
...   print(idx, X[idx])
...   it.iternext()
...
(0, 0) ita
True
(0, 1) zuri
True
(1, 0) taka
True
(1, 1) hiro
False

無名関数

def myfunc(x):
    return x ** 2

は次のように書き換えられる。

myfunc = lambda x: x ** 2

時間の測定

import time

start = time.time()
elapsed_time = time.time() - start

dict型
dictは挿入した順番が記憶されず維持できない。

>>> dict = {"oneKey":1, "twoKey":2, "threeKey":3}
>>> print(dict)
{'threeKey': 3, 'oneKey': 1, 'twoKey': 2}
  • key, valueの一覧取得
>>> price = {'apple':120, 'orange':150, 'banana': 180}
>>> print(price.keys())
dict_keys(['banana', 'apple', 'orange'])
>>> print(price.values())
dict_values([180, 120, 150])
>>> print(price.items())
dict_items([('banana', 180), ('apple', 120), ('orange', 150)])
  • ループ

一覧の取得だけではなく、イテレータとしても使用可能。

>>> for key, value in price.items():
...     print("key: " + str(key) + ", value: " + str(value))
...
key: banana, value: 180
key: apple, value: 120
key: orange, value: 150

>>> for key in price.keys():
...     print(key)
...
banana
apple
orange

>>> for value in price.values():
...     print(value)
...
180
120
150

numpyのいろいろ
listからnp.arrayへの変換

>>> list = [0, 1, 2, 3]
>>> array = np.array(list)

arange

>>> list = np.arange(10)
>>> print(list)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  • 値の変更
>>> price['apple'] = 130
>>> print(price['apple'])
130
  • オブジェクトの長さの取得
>>> print(len(price))
3
  • 追加
>>> price['kiwi'] = 50
>>> print(price)
{'banana': 180, 'kiwi': 50, 'apple': 130, 'orange': 150}
  • 二つのオブジェクトを連結
>>> price1 = {'apple': 120, 'orange': 150, 'banana': 180}
>>> price2 = {'grape': 300, 'melon': 500, 'peach': 200}
>>>
>>> price.update(price2)
>>> print(price)
{'kiwi': 50, 'apple': 130, 'orange': 150, 'peach': 200, 'melon': 500, 'banana': 180, 'grape': 300}

配列各要素の累乗

>>> list = [0, 1, 2, 3, 4]
>>> power = np.power(list, 2)
>>> print(power)
[0, 1, 4, 9, 16]
  • 要素の削除
>>> print(price)
{'kiwi': 50, 'apple': 130, 'orange': 150, 'peach': 200, 'melon': 500, 'banana': 180, 'grape': 300}
>>> del price['banana']
>>> print(price)
{'kiwi': 50, 'apple': 130, 'orange': 150, 'peach': 200, 'melon': 500, 'grape': 300}
  • clear
>>> print(price)
{'kiwi': 50, 'apple': 130, 'orange': 150, 'peach': 200, 'melon': 500, 'grape': 300}
>>> price.clear()
>>> print(price)
{}

OrderedDict
dictと使い方自体はあまり変わらないが、書き方は追加していくように書き、順番を記憶してくれる。

>>> from collections import OrderedDict
>>> OrderedPrice = OrderedDict()
>>> OrderedPrice['orange'] = 150
>>> OrderedPrice['apple'] = 130
>>> OrderedPrice['kiwi'] = 50
>>> price = {'orange': 150, 'apple': 130, 'kiwi':50}
>>> print(OrderedPrice)
OrderedDict([('orange', 150), ('apple', 130), ('kiwi', 50)])
>>> print(price)
{'kiwi': 50, 'apple': 130, 'orange': 150}
  • 逆順
>>> testOrderedDict = OrderedDict()
>>>
>>> testOrderedDict['one'] = 1
>>> testOrderedDict['two'] = 2
>>> testOrderedDict['three'] = 3
>>> testOrderedDict['four'] = 4
>>> testOrderedDict['five'] = 5
>>> print(testOrderedDict)
OrderedDict([('one', 1), ('two', 2), ('three', 3), ('four', 4), ('five', 5)])
>>> reverse = list(testOrderedDict.values())
>>> reverse.reverse()
>>> print(reverse)
[5, 4, 3, 2, 1]

内積

>>> a = np.array([3, 3])
>>> b = np.array([5, 0])
>>> np.dot(a, b)  #15

ランダム
np.arange(a)からb個ランダムに選択

>>> np.random.choice(a, b)

属性(attributes)

  • 次元数
ndarray.ndims
ndarray.size
ndarray.shape
  • データ型
ndarray.dtype

乱数

  • 一様乱数
import numpy as np
np.random.rand()       # 0~1の乱数を1個生成
np.random.rand(100)    # 0~1の乱数を100個生成
np.random.rand(10, 10) # 0~1の乱数で10x10の行列を生成

np.random.rand(100) * 40 + 30 # 30~70の乱数を100個生成
  • 特定の分布関数に従う乱数
import numpy as np

# 標準正規分布
np.random.randn()       # 標準正規分布(平均0, 標準偏差1)
np.random.randn(10)     # 標準正規分布を10個生成
np.random.randn(10, 10) # 標準正規分布による10x10の行列

# 二項分布
np.random.binomical(n=100, p=0.5) # 確率pで表が出るコインをn回投げて表が出る確率

# ポアソン分布
np.random.poisson(lam=10) # lambda=10のポアソン分布

# ベータ分布
np.random.beta(a=3, b=5)
  • 整数
import numpy as np

np.random.randint(100)             # 0~99の整数を1個
np.random.randint(30, 70)          # 30~69の整数を1個
np.random.randint(0, 100, 20)      # 0~99の整数を20個
np.random.randint(0, 100, (5, 5))  # 0~99の整数で5x5の行列
  • リストからのランダム抽出
import numpy as np
list = np.arange(10)

np.random.choice(list)
np.random.choice(list, 10)
np.random.choice(list, 5, replace=False)

# 確率で重みづけをする
weight = np.random.randn(10)
random.choice(list, p=weight)