前回のNumpy tutorialの続きをこのサイトを参考にしながらやる。今回はUniversal functions (Ufuncs)についてのチュートリアルをやる。
スポンサーリンク
Universal functions (Ufuncs)¶
import os
import sys
import glob
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
%matplotlib inline
%precision 4
plt.style.use('ggplot')
xs = np.linspace(0, 2*np.pi, 100)
ys = np.sin(xs) # np.sin is a universal function
plt.rcParams['figure.figsize'] = 12, 8
plt.rcParams["font.size"] = "17"
plt.plot(xs, ys);
演算子もデフォルトでelementwise(要素ごとに)演算を行う。
# operators also perform elementwise operations by default
xs = np.arange(10)
print (xs)
print (-xs)
print (xs+xs)
print (xs*xs)
print (xs**3)
print (xs < 5)
スポンサーリンク
Generalized ufucns¶
universal function(万能関数)は、スカラーに対してvectorized looping(ベクトル化ループ)を行う。generalized ufucn(汎用ufunc)は、ベクトルや配列に対してループを実行する。現在、numpyはたった一つの汎用ufuncしか提供してないが、それらは、今後カバーするトピックである、numbaのJITコンパイルに対して重要な役割を演じている。
from numpy.core.umath_tests import matrix_multiply
print (matrix_multiply.signature)
us = np.random.random((5, 2, 3)) # 5 2x3 matrics
vs = np.random.random((5, 3, 4)) # 5 3x4 matrices
# perform matrix multiplication for each of the 5 sets of matrices
ws = matrix_multiply(us, vs)
print (ws.shape)
print (ws)
スポンサーリンク
Random numbers¶
広く利用されている(疑似)乱数用の2つのモジュールが存在する。ある分布から乱数を生成するだけならnumpy.randomモジュールを使うのが最も簡単だ。分位点やPDFのような分布に関するより多くの情報が必要な場合、scipy.statsモジュールが使える。
import numpy.random as npr
npr.seed(123) # fix seed for reproducible results
サイコロを100回振るのを10回トライする。
# 10 trials of rolling a fair 6-sided 100 times
roll = 1.0/6
x = npr.multinomial(100, [roll]*6, 10)
x
# uniformly distributed numbers in 2D
x = npr.uniform(-1, 1, (100, 2))
plt.rcParams['figure.figsize'] = 12, 8
plt.rcParams["font.size"] = "17"
plt.scatter(x[:,0], x[:,1], s=50)
plt.axis([-1.05, 1.05, -1.05, 1.05]);
ベクトルをランダムにシャッフルする。
# ranodmly shuffling a vector
x = np.arange(10)
npr.shuffle(x)
x
ランダム並び替え
# radnom permutations
npr.permutation(10)
置換無しランダムセレクション
# radnom selection without replacement
x = np.arange(10,20)
npr.choice(x, 10, replace=False)
置換有りランダムセレクション
# radnom selection with replacement
npr.choice(x, (5, 10), replace=True) # this is default
# toy example - estimating pi inefficiently
n = 1000000
x = npr.uniform(-1,1,(n,2))
4.0*np.sum(x[:,0]**2 + x[:,1]**2 < 1)/n
スポンサーリンク
スポンサーリンク