sti320a

勉強したことのまとめ

勉強したことのまとめ_2020年04月13日

Matplotlib

import matplotlib as mpl
mpl.__version__

import numpy
numpy.__version__

import matplotlib.pyplot as plt
plt.style.use('seaborn')

mpl.rcParams['font.family'] = 'serif'

# Commented out IPython magic to ensure Python compatibility.
# %matplotlib inline

import numpy as np
np.random.seed(1000)
y = np.random.standard_normal(20)

x = np.arange(len(y))

plt.plot(x, y) # numpy.ndarray が plt.plot には渡せる

plt.plot(y) # xがない場合、indexが使われる

plt.plot(y.cumsum())

plt.plot(y.cumsum())
plt.grid(False) # grid線を失くす
plt.axis('equal') # 軸のスケールを同じにする

plt.axis()

plt.plot(y.cumsum())
plt.xlim(-1, 20)
plt.ylim(np.min(y.cumsum()) - 1, np.max(y.cumsum()) + 1)

plt.figure(figsize=(10, 6))
plt.plot(y.cumsum(), 'b', lw=1.5) # 1.5pointの青い線
plt.plot(y.cumsum(), 'bo') # データを青い点でプロット b:カラーコード(blue), o:円 
plt.xlabel('index') # x軸のラベルを記述
plt.ylabel('value') # y軸のラベルを記述
plt.title('A Simple Plot') # 表題を記述

勉強したことのまとめ_2020年04月13日

Python

n = 65
type(n)
n.numerator
n.bit_length()
n.to_bytes(1, byteorder='little')
(10).to_bytes(1, byteorder='big')
(16).to_bytes(1, byteorder='big')
(70).to_bytes(1, byteorder='big')
  • sizeof()
l = [1,2,3,4]
l.__sizeof__() # メモリ使用量(バイト)が取得できる (72)
l = [1]
l.__sizeof__() # 48
l = [1,2]
l.__sizeof__() # 56
l = [1,2,3]
l.__sizeof__() # 64
l = []
l.__sizeof__() # 40
t = ()
t.__sizeof__() # 24
s = ''
s.__sizeof__() # 53
i = 0
i.__sizeof__() # 24

import numpy as np
n = np.ndarray((1,1))
n.__sizeof__() # 120
class Test():
  pass
c = Test()
c.__sizeof__() # 32
  • 特殊メソッドの実装
class Vector():
  def __init__(self, x=0, y=0, z=0):
    self.x = x
    self.y = y
    self.z = z

v = Vector(1, 2, 3)

class Vector(Vector):
  def __abs__(self):
    return (self.x ** 2 + self.y ** 2 + self.z ** 2) ** 0.5
  def __bool__(self):
    return bool(abs(self))

v = Vector(1, 2, -1)
v.__abs__()

abs(v)

bool(v)

class Vector(Vector):
  def __getitem__(self, i):
    if i == 'Test':
      return 'Success'
    else:
      return i

v = Vector()

v['Test']

v[15]

class Vector(Vector):
  def __getitem__(self, i):
    if i == 'Test':
      return 'Fail'
    else:
      return i

v = Vector()

v['Test']

class Vector(Vector):
  def __iter__(self):
    for i in range(3):
      yield i

v = Vector()

for i in range(3):
  print(v[i])

勉強したことまとめ_2020年04月11日

pandas

  • DataFrame() が引数にとれるデータ(data)の形式を3つあげよ
ndarray, dict, DataFrame。dict は Series, ndarray, list を要素に持てる。
  • pandas は数学演算がうまくいかない場合、結果をどのような値で置き換えるか
NaN値
  • 時系列データの扱い
import numpy as np
import pandas as pd

np.random.seed(100)
# 標準正規分布従うデータをランダムに出力
a = np.random.standard_normal((9, 4))
df = pd.DataFrame(a)


# カラムを設定
df.columns = ['No1', 'No2', 'No3', 'No4']

# 特定のカラムの平均値を計算
df['No2'].mean()

# DatetimeIndex オブジェクトを作成する
dates = pd.date_range('2019-1-1', periods=9, freq='D')

# インデックスを DatetimeIndex に置き換える
df.index = dates

# DataFrame のデータを表示
df.values
  • データの可視化
# DataFrame のメタデータを表示
df.info()

# 要約統計量を表示
df.describe()

df.sum()
df.mean()
df.mean(axis=0)
df.mean(axis=1)

df.cumsum() # 累積和 cumulation sum

# DataFrame は numpy のユニバーサル関数も使用可能
np.mean(df)
np.log(df)
np.sqrt(abs(df))
np.sqrt(abs(df)).sum()

100 * df + 100

# 可視化
from pylab import plt, mpl

# スタイルの設定
plt.style.use('seaborn')
mpl.rcParams['font.family'] = 'serif'

# %matplotlib inline

# プロット
df.cumsum().plot()
df.cumsum().plot(kind='bar')

type(df)
  • Seriesオブジェクト
S = pd.Series(np.linspace(0, 15, 7), name="series")
type(S)
s = df['No1']
type(s)
s.mean()
s.plot()
  • グループ化
import pandas as pd
df = pd.DataFrame([[11, 12, 13],[14, 15, 16],[14, 15, 16],[1, 2, 3]],
                  columns=['numbers', 'numbers2', 'numbers3'],
                  index=['A', 'B', 'C', 'D']
                  )

# グループ化
df['Quarter'] = ['A', 'B', 'C', 'A']
groups = df.groupby('Quarter')

groups.size()
groups.mean()
groups.max()

# 集計
groups.aggregate([min, max]).round(2)

# 複数列のグループ化
df['Odd_Even'] = ['Odd', 'Even', 'Odd', 'Even']
groups = df.groupby(['Quarter', 'Odd_Even'])

groups.size()

# 集計
import numpy as np
groups[['numbers', 'numbers3']].aggregate(['sum', np.mean])
groups.aggregate(['sum', np.mean])
  • 論理式による複合選択
data = np.random.standard_normal((10, 2))
df = pd.DataFrame(data, columns=['x', 'y'])
df.info()
df.head()
df.tail()
df['x'] > 0.5
df > 0.5
(df['x'] > 0) & (df['y'] < 0)
(df['x'] > 0) | (df['y'] < 0)
df[df['x'] > 0]
df.query('x > 0')
df.query('x > 0 & y < 0')
df[df > 0]
  • 連結やマージ
df1 = pd.DataFrame(['100', '200', '300', '400'], index=['a', 'b', 'c', 'd'], columns=['A'])
df2 = pd.DataFrame(['200', '300', '400'], index=['f', 'g', 'h'], columns=['B'])
  • 連結
df1.append(df2, sort=False)
pd.concat((df1, df2))
  • 結合
df1.join(df2)
df2.join(df1)
df1.join(df2, how='right')
df1.join(df2, how='inner')
df = pd.DataFrame()
df['A'] = df1['A']
  • マージ
c = pd.Series([250, 150, 50], index=['b', 'd', 'c'])
df1['C'] = c
df2['C'] = c
pd.merge(df1, df2)

テスト

  • テストのピラミッドとは何か
下から順に「Unitテスト」「 統合テスト」「 UIテスト」を積み上げたピラミッド。
Unit テストは、コードレベルでのテストしかできないものの、低コストで高速である。
UIテストは、ユーザーが触れるインターフェースを総合してテストできるため信頼性は高いが、高コストで時間がかかる。
統合テストはその中間。

既存の手法では、UIテストが最も重視され、信頼性と引き換えに莫大な時間とコストを割いていた。
Unit テストは開発者が実装し、高速で検証するサイクルを作れるため、UIテストや統合テストより以前に実施することにより、
開発者にとってもテスターにとってもメリットがあるよ、というお話に用いられる。

ブラケット記法/pandas_2020年04月10日

ブラケット記法

  • ブラケット記法について、ある一対のケットが正規直交基底を形成するかを調べるには、何と何を確かめればよいか。
それぞれのケットが単位ベクトルであること
それらのケットが直行すること

pandas

  • 以下のコードで変数 df にはどのような値が格納されているか
import pandas as pd
df = pd.DataFrame([10, 20, 30, 40], columns=['numbers'], index=['a', 'b', 'c', 'd'])
 numbers
a   10
b   20
c   30
d   40
  • 以下のコードで df.index にはどのような値が格納されているか
import pandas as pd
df = pd.DataFrame([10, 20, 30, 40], columns=['numbers'], index=['a', 'b', 'c', 'd'])
df.index
Index(['a', 'b', 'c', 'd'], dtype='object')
  • 以下のコードで df.columns にはどのような値が格納されているか
import pandas as pd
df = pd.DataFrame([10, 20, 30, 40], columns=['numbers'], index=['a', 'b', 'c', 'd'])
df.columns
Index(['numbers'], dtype='object')
  • 以下のコードで変数 df.loc['c'] はどのような出力になるか
import pandas as pd
df = pd.DataFrame([10, 20, 30, 40], columns=['numbers'], index=['a', 'b', 'c', 'd'])
df.loc['c']
numbers    30
Name: c, dtype: int64
  • 以下のコードで df.loc[ [ 'a', 'd' ] ] はどのような出力になるか
import pandas as pd
df = pd.DataFrame([10, 20, 30, 40], columns=['numbers'], index=['a', 'b', 'c', 'd'])
df.loc[['a', 'd']]
 numbers
a   10
d   40
  • 以下のコードで変数 df.iloc[1:3] はどのような出力になるか
import pandas as pd
df = pd.DataFrame([10, 20, 30, 40], columns=['numbers'], index=['a', 'b', 'c', 'd'])
df.iloc[1:3]
numbers
b   20
c   30
  • 以下のコードで変数 df.sum() はどのような出力になるか
import pandas as pd
df = pd.DataFrame([10, 20, 30, 40], columns=['numbers'], index=['a', 'b', 'c', 'd'])
df.sum()
numbers    100
dtype: int64
  • 以下のコードで変数 df.apply(lambda x: x**2) はどのような出力になるか
import pandas as pd
df = pd.DataFrame([10, 20, 30, 40], columns=['numbers'], index=['a', 'b', 'c', 'd'])
df.apply(lambda x: x**2)
 numbers
a   100
b   400
c   900
d   1600
  • 以下のコードで変数 df**2 はどのような出力になるか
import pandas as pd
df = pd.DataFrame([10, 20, 30, 40], columns=['numbers'], index=['a', 'b', 'c', 'd'])
df ** 2
 numbers
a   100
b   400
c   900
d   1600

線形代数に関する問題_2020年04月09日

  • ブラケット記法について同じ次元のブラとケットの積はどのように書くか。ブラ <a| とケット |b> の積を書け。
<a|b>

ブラとケットを並べて重複した垂直線の片方を省略する。
  • 2つのケット |a> と |b> が直行するのはどのようなときか
 |a> と |b> の積(<a|b>)が 0 になるとき。
(証明略)
  • すべての二次元ベクトルの集合は一般にどのように表記されるか
R^2
  • 正規直交基底とは何か
正規とは(正規化からきている)単位のこと。直交とは文字通り直交すること。
正規直交基底とは、それぞれの長さが 1(単位ベクトル)で互いに直交する(<a|b> = 0)となる基底のことをいう。
  • 基底とは何か



  • 標準基底とは何か



  • 粒子のスピンの方向を標準基底を用いて表現するとき、どのような書き方を用いるか。例を3つ挙げよ。



    
    
  

線形代数/Numpy/cssに関する問題_2020年04月09日

線形代数に関する問題

  • ブラケット記法について、ブラとは何を意味するか
縦書きのベクトル(列ベクトル)
  • ブラケット記法について、ケットとは何を意味するか
横書きのベクトル(行ベクトル)
  • ブラ、ケットの命名はある人物に由来する。誰か
ポール・ディラック
  • v のケットをポールディラックが導入した記法を用いて書け
|v〉
  • w のブラをポールディラックが導入した記法を用いて書け
〈w|

Numpy に関する問題

  • ベクトル化とは何か
配列の要素を繰り返し処理で1つずつ計算しているものを、ベクトル計算機で高速に計算できるように、変形すること。
  • ベクトル化の目的は何か
高速に計算を実行するため。
  • numpy.random.seed(seed=100) は何を意味するか
numpy における擬似乱数生成に使用する seed を設定する。
  • 擬似乱数生成法について、一般的な生成法を3つ以上挙げよ。
例)
平方採中法(二乗中抜き法, middle-square method)
線形合同法 
線形帰還シフトレジスタ
メルセンヌ・ツイスタ
など
  • 平方採中法(二乗中抜き法)ではどのようにして、擬似乱数を生成するか。
3桁の擬似乱数を必要としているとする。
まず、適当な値を1つ決める(これが seed。たとえば 123 とする)。
次に、決めた値を二乗する(123^2  = 15129)。
二乗した値の中央から必要な桁数を取得する(今回は3桁欲しいので 512)。
これをさらに二乗して中央から3桁取得して ... 、を繰り返して乱数列を得る。
過去に同じ値が出ていればループになる(このループの長さを周期という)。
周期が最長のものを使うため線形合同法が使われる。

css に関する問題

  • width: 100vw や height: 100vh; における v は何を意味するか。また、vw, vh はそれぞれどのような指定を意味するか。
v は viewport。vw は viewport width で vh は viewport height。 それぞれ viewport に対する幅、高さの指定になる。

fileプロトコル/Numpy/ユーザーインターフェースに関する問題_2020年4月8日

fileプロトコルに関する問題

  • リソースの URIを表現する際 http:// のように [protocol schema]:/// のように表示する決まりがあるが、ブラウザでテキストファイル等を開いたとき、URLに file:///Users/... または file:///C:/... のように、file: の後に 3つのスラッシュが表示される場合がある。これはなぜか。
URIの仕様として、ローカルホスト(localhost)のリソースにアクセスする際には <host> 部を省略できるため、host の部分だけがなくなり、スラッシュだけが残って /// となる。
  • URI の仕様を知りたい場合、何を見れば良いか
RFC3986

Numpy に関する問題

  • Numpy でカラムごとに異なる dtype を定義するにはどのようにすればよいか
numpy.dtype() を用いる。

例)
import numpy
numpy.dtype([('Name', 'str'), ('Age', 'i4'), ('Height', 'f')])
  • カラムごとに異なる dtype を定義し、それを用いた ndarray を作れ
例)
import numpy as np
dt = np.dtype([('Name', 'str'), ('Age', 'int'), ('Height', 'float')])
s = np.array([('Tony', 50, 180.0)], dtype=dt)
  • 以下の ndarray について Age カラムの平均を求めるにはどうすればいいか
import numpy as np
dt = np.dtype([('Name', 'str'), ('Age', 'int'), ('Height', 'float')])
target = np.array([('Tony', 50, 180.0)], dtype=dt)
(解答)target['Age'].mean()
(出力)50.0

ユーザーインターフェースに関する問題

  • 事実の知覚された特陵、あるいは現実の特徴、特に、そのものをどう使うことができるか、を決定する特徴、の意で使われる語は何か
アフォーダンス
  • 物事の仕組みや動作、構造などを単純化して本質的な部分だけを抽出したモデルをなんというか
概念モデル
  • デザインモデルとは何か
デザイナーが(頭の中に)持つ概念モデル