Remrinのpython攻略日記

python3に入門しました。python3についてあれこれとサンプルコードとか。

NumPyの使い方(3) インデックス、スライス

NumPyのインデックス、スライスについて。
 

1次元配列のインデックス、スライス

 
値の参照:python組み込みのlistと同様
値の代入:まとめて同じ値が代入(ブロードキャスト)
 

import numpy as np

# 値の参照、代入
a1 = np.arange(1, 10)
print(a1)      # [1 2 3 4 5 6 7 8 9]
print(a1[3])   # 4
print(a1[3:6]) # [4 5 6]

a1[3:6] = 0    # すべての要素の0を代入
print(a1)      # [1 2 3 0 0 0 7 8 9]

 
[注意]部分配列はコピーではなくビューになる。つまり、
 参照して作成した部分配列の要素を変更すると、参照元のndarrayも変更される。

a1 = np.arange(1, 10)
print(a1)  # [1 2 3 4 5 6 7 8 9]

# インデックス参照で新たな変数を作り代入した場合は元は保存
x = a1[8]
x = 0
print(a1)  # [1 2 3 4 5 6 7 8 9]

# スライス参照で新たな部分配列を作り代入した場合は元も変更
a2 = a1[3:6]
a2[:] = 10
print(a2)  # [10 10 10]
print(a1)  # [ 1  2  3 10 10 10  7  8  9]

a2[0] = 20
print(a2)  # [20 10 10]
print(a1)  # [ 1  2  3 20 10 10  7  8  9]

# built-inのlist型とは挙動が異なる
list1 = list(range(1, 10))
list1[3:6] = [0]
print(list1) # [1, 2, 3, 0, 7, 8, 9]

# 元のndarrayを保存したいときはcopy()メソッドを使う。
a2 = a1[0:3].copy()

 

2次元配列のインデックス

・a2[1][0] arr2の1行目0列目の要素を指定
・a2[1, 0] 同義

a2 = np.array([[1, 2, 3], [4, 5, 6]])
print(a2)        # [[1 2 3]
                 #  [4 5 6]]
print(a2.shape)  # (2, 3)

print(a2[1][0])  # 4
print(a2[1, 0])  # 4

 

3次元配列のインデックス

 a3[0][1][2] a3の0枚目の1行目の2列目

a3 = np.array([[[1, 2, 3], [4, 5, 6]],[[7, 8, 9], [10, 11, 12]]])
print(a3)        
# [[[ 1  2  3]
#   [ 4  5  6]]
#
#  [[ 7  8  9]
#   [10 11 12]]]
print(a3.shape)  # (2, 2, 3)

print(a3[0]) 
# [[1 2 3]
#  [4 5 6]]
print(a3[0, 1])     #[4 5 6] 
print(a3[0, 1, 2])  # 6

 

多次元配列のスライス参照

・スライスすると配列の次元は変わらない。
・(数値で)インデックス参照すると次元が1つ減る。
 

3次元配列のa3について、

スライス     部分配列
a3[1:]       3次元
a3[1]        2次元
a3[1:, 1:]   3次元
a3[1, 1:]    2次元
a3[1, 1]     1次元
a3[1, 1, 1]  0次元、つまり値

 

# 3次元配列を用意
a3 = np.array([[[1, 2, 3], [4, 5, 6]],[[7, 8, 9], [10, 11, 12]]])
print(a3)        
# [[[ 1  2  3]
#   [ 4  5  6]]
#
#  [[ 7  8  9]
#   [10 11 12]]]
print(a3.shape)  # (2, 2, 3)

print(a3[1:].ndim)      # 3
print(a3[1].ndim)       # 2
print(a3[1:, 1:].ndim)  # 3
print(a3[1, 1:].ndim)   # 2
print(a3[1, 1].ndim)    # 1
print(a3[1, 1, 1].ndim) # 0

print(a3[1:])      # [[[ 7  8  9]
                   #   [10 11 12]]]
print(a3[1])       # [[ 7  8  9]
                   #  [10 11 12]]
print(a3[1:, 1:])  # [[[10 11 12]]]
print(a3[1, 1:])   # [[10 11 12]]
print(a3[1, 1])    # [10 11 12]
print(a3[1, 1, 1]) # 11

 

ブールインデックス

bool値がTrueとなるものだけを選ぶことができる。
ビュー(参照)ではなく、コピーとなる。

rgb = np.array(["r", "g", "b", "r", "g", "b"])
print(rgb == "r")
# [ True False False  True False False]

print(rgb[rgb == "r"])   #['r' 'r']
print(rgb[rgb != "r"])   #['g' 'b' 'g' 'b']

 

rgb = np.array(["r", "g", "b", "r", "g", "b"])

# 乱数の初期化
np.random.seed(1)
# 0~255までの乱数で6行4列の配列を作る
data = np.random.randint(0, 256, size=(6, 4))
print(data)
# [[ 37 235 140  72]   # r
#  [255 137 203 133]   # g
#  [ 79 192 144 129]   # b
#  [204  71 237 252]   # r
#  [134  25 178  20]   # g
#  [254 101 146 212]]  # b

print(data[rgb == "r"]) # rgbがrの行だけを抽出
# [[ 37 235 140  72]
#  [204  71 237 252]]

print(data[rgb != "r"]) # rgbがr以外の行を抽出(1)
# [[255 137 203 133]
#  [ 79 192 144 129]
#  [134  25 178  20]
#  [254 101 146 212]]

# 真偽値のbit反転でも書ける
print(~(rgb == "r"))
# [False  True  True False  True  True]

print(data[~(rgb == "r")]) # rgbがr以外の行を抽出(2)
# [[255 137 203 133]
#  [ 79 192 144 129]
#  [134  25 178  20]
#  [254 101 146 212]]

print(data[rgb == "r", 0:2]) # rbgがrの行の0~1列目の要素
# [[ 37 235]
#  [204  71]]

print(data[rgb == "r", 0]) # rbgがrの行の0列目の要素
# [ 37 204]  1次元の配列は横向き(横ベクトル)で表示

data[data < 100] = 0  # 100未満のすべての要素を0にする。
print(data)
# [[  0 235 140   0]
#  [255 137 203 133]
#  [  0 192 144 129]
#  [204   0 237 252]
#  [134   0 178   0]
#  [254 101 146 212]]

 

ファンシーインデックス

複数のインデックス参照を整数配列(list, ndarrayなど)で指定する。
スライスと違い、元データのコピーを返す。 
 

list1 = [[i+j for i in range(5)] for j in range(0, 50, 10)]
a1 = np.array(list1)
print(a1)
# [[ 0  1  2  3  4]
#  [10 11 12 13 14]
#  [20 21 22 23 24]
#  [30 31 32 33 34]
#  [40 41 42 43 44]]

print(a1[1]) # [10 11 12 13 14] 1列目
print(a1[3]) # [30 31 32 33 34] 3列目

#インデック指定であることを表す[]の中にlistの[] >>> 2重[[]]
print(a1[[1, 3, 1]]) #1列目、3列目、1列目の順に参照
# [[10 11 12 13 14]
#  [30 31 32 33 34]
#  [10 11 12 13 14]]

print(a1[[-1, -2, -3]]) #後ろから1列目、2列目、3列目
# [[40 41 42 43 44]
#  [30 31 32 33 34]
#  [20 21 22 23 24]]

# 5行10列の配列の準備
a2 = np.arange(50).reshape(5, 10)
print(a2)
# [[ 0  1  2 ...,  7  8  9]
#  [10 11 12 ..., 17 18 19]
#  [20 21 22 ..., 27 28 29]
#  [30 31 32 ..., 37 38 39]
#  [40 41 42 ..., 47 48 49]]

print(a2[[0, 1, 2, 3],[9, 8, 7, 6]])
# [ 9 18 27 36]

print(a2[range(5), range(5)])
# [ 0 11 22 33 44]

print(a2[[1, 3]][:, range(1, 10, 2)])
# 10の位も1の位も奇数の要素
# [[11 13 15 17 19]
#  [31 33 35 37 39]]

# np.ix_(list1, list2)でも同義
print(a2[np.ix_([1, 3], range(1, 10, 2))])
# [[11 13 15 17 19]
#  [31 33 35 37 39]]

 

take()とput()

take()は指定されたindexから値を取得。
put()は指定されたindexに値を代入。

a1 = np.arange(0, 100, 10)
print(a1)
# [ 0 10 20 30 40 50 60 70 80 90]

print(a1.take([1, 3, 5]))
# [10 30 50]

a1.put([1, 3, 5], [0, 0, 0])
print(a1)
# [ 0  0 20  0 40  0 60 70 80 90]

a2 = np.arange(6).reshape(2, 3)
print(a2)
# [[0 1 2]
#  [3 4 5]]

print(a2.take([1], axis=1))
# [[1]
#  [4]]

print(a2.take([1], axis=0))
# [[3 4 5]]

print(a2.take([1])) # axis指定なしだと1d化
# [1]

print(a2)
a2.put([4, 5], 10) # flatten後のindexを指定
print(a2)
# [[ 0  1  2]
#  [ 3 10 10]]

 

NumPyの使い方(2) データ型

NumPyのデータ型

dtype 略号 種類  
int32 i, i4 符号あり整数 32bit
unit32 I, u4 符号なし整数 32bit
float32 f, f4 小数 64bit
complex64 F, c8 複素数 128bit
bool 真偽値 True, False
object O pythonオブジェクト  
string バイト文字列型 固定長。5文字なら'S5'など
unicode ユニコード文字列型 'U10'など。日本語を扱う時

 
ビット数を指定できる型

データ 種類
符号あり整数 int8~int64
符号なし整数 unit8~64
小数 float~128
複素数 complex64~256

略語もいろいろありそうだけど、覚えられなそう
 

型変換(cast)

np.astype()で変換する型を指定する。
データがコピーされ、新規オブジェクトが作られる。
小数を整数に型変換するときは原点方向に丸められる。
型変換不可能なときはValueErrorが発生。

a1 = np.array([1, 3, 5])
print(a1.dtype)  # int32

# 符号なし整数へ型変換
a2 = a1.astype(np.uint32)
print(a2.dtype)  # unit32

a3 = np.array([-1.5, -0.8, 1.5, 2.1, 3.9])
print(a3.dtype)  # float64

# 整数へ型変換すると原点方向へ丸め
a3 = a3.astype(np.int32)
print(a3)        # [-1  0  1  2  3]

a4 = np.array(["赤", "青", "緑"])
print(a4.dtype) # <U1 ユニコード文字列型
print(a4)       # ['赤' '青' '緑']
#a4 = a4.astype(np.float64)
# ValueError: could not convert string to float: '赤'

# 既に存在している他のndarrayオブジェクトと同一の型を指定できる
a5 = np.array([3.6, 1.8])
a5 = a5.astype(a1.dtype)
print(a5.dtype)  # int32

 
・ndarray生成時にdtypeを指定できる。

a1 = np.array([1, 3, 5], dtype=np.uint32)
print(a1.dtype)  # unit32

 

NumPyの使い方(1) 配列の生成

NumPyの使い方について。
 

NumPyとは

・NumPy: numerical pythonの略。科学技術計算の基盤となるパッケージ
・多次元配列オブジェクト ndaaryay(N-dimensional array)
・高速演算
・ファイルの読み書き
線形代数フーリエ変換、乱数
・C、C++FORTRANのコートとpythonを結合、統合するツール
 
配列をメモリの連続領域に保持している。
ndarrayクラスは同じ型の要素だけを含む。
import numpy as np という形でインポートする。
 

ndarrayの基本属性

dtype: データの型
ndim: 次元数(ネストの深さ)
shape: (行数, 列数)のタプル
size: 全要素数

import numpy as np

arr1 = np.array([[1, 2, 3], [4, 5, 6]])
print(type(arr1)) # <class 'numpy.ndarray'>
print(arr1)       # [[1 2 3]
                  #  [4 5 6]]

print(arr1.dtype) # int32
print(arr1.ndim)  # 2
print(arr1.shape) # (2, 3)
print(arr1.size)  # 6

 

ndarrayの生成

np.array(seq) seq:list, tupleなど
np.asarray(seq) array()と同様。ただし、seqがndarrayなら同一オブジェクトへの参照
np.zeros([2, 3]) 2行、3列のゼロ行列。zeros( (2, 3) )でも。
np.zeros_like(seq) seqの同形(shape)かつ同型(dtype)のゼロ行列
np.ones( (2, 3) ) 2行、3列の1で埋めた行列
np.ones_like(a) aと同じshapeで1埋めをする。
np.empty() ゼロ埋めではなく、メモリ確保をするだけで、値は不定。
np.empty_like(a)
np.arange() range()同様の等差数列
np.linspace(1, 2, 5) 初項1、末項2、項数5の等差数列
np.eye(3) 単位行列から一部を切り抜いたもの、np.eye(3, 2)のように正方行列でなくても。
np.identity 単位行列
np.ndarray.fill(value) 数値埋め

 

arr1 = np.array([1, 2, 3])
arr2 = np.asarray(arr1) # arr1と同一オブジェクト
arr3 = np.array(arr1)   # arr1とは別オブジェクト

arr2[1]=10
print(arr1, arr2, arr3)  # [ 1 10  3] [ 1 10  3] [1 2 3]

a1 = np.zeros(5)
print(a1)  # [ 0.  0.  0.  0.  0.]

a2 = np.zeros([2, 5])
print(a2)
# [[ 0.  0.  0.  0.  0.]
#  [ 0.  0.  0.  0.  0.]]


print(np.ones([2, 3, 4]))  # 3次元の配列(テンソル)
# [[[ 1.  1.  1.  1.]
#   [ 1.  1.  1.  1.]
#   [ 1.  1.  1.  1.]]
#
#  [[ 1.  1.  1.  1.]
#   [ 1.  1.  1.  1.]
#   [ 1.  1.  1.  1.]]]

a3 = np.empty(4)
print(a3)
# [   0.        0.      262.6525  252.84  ]

a4 = np.arange(5)
print(a4)  # [0 1 2 3 4]

print(np.identity(3))
# [[ 1.  0.  0.]
#  [ 0.  1.  0.]
#  [ 0.  0.  1.]]

a3.fill(100)
print(a3)  # [ 100.  100.  100.  100.]

 
※1次元ndarray(ベクトル)は縦横をnp自身が臨機応変に使い分けるが、
 自分で指定するときは2次元配列にする。
 横ベクトル[ [1, 2, 3] ]、 縦ベクトル[[1], [2], [3]]

 

内包表記

内包表記(comprehension)の使い方。
 
map()やfilter()に近い使い方を高速に実行できる表記方法。

l2 = [x*2 for x in range(4)]   # リスト内包表記  [0, 2, 4, 6]
g  = (x*2 for x in range(4))   # ジェネレータ式  0, 2, 4,...
d2 = {x:x*2 for x in range(4)} # dict内包表記    {0:0, 1:2, 3:6}
s2 = {x*2 for x in range(4)}   # set内包表記     {0, 2, 4, 6}

 

map()に似た使い方

list1 = map(lambda x:x**2, range(5))
print(type(list1))  # <class 'map'>
#print(len(list1))  # TypeError: object of type 'map' has no len()
print(list(list1))  # [0, 1, 4, 9, 16]

 
上記のコードをリスト内包表記を使って書くと

list1 = [i**2 for i in range(5)]
print(type(list1))  # <class 'list'>
print(len(list1))   # 5
print(list1)        # [0, 1, 4, 9, 16]

 

filterに似た使い方

list1 = filter(lambda i:i%2 == 1, range(5))
print(type(list1))  # <class 'filter'>
#print(len(list1))  # object of type 'filter' has no len() 
print(list(list1))  # [1, 3]

 
上記のコードを内包表記を使って書くと

list1 = [i for i in range(5) if i%2 == 1]
print(type(list1))  # <class 'list'>
print(len(list1))   # 2
print(list1)        # [1, 3]

 

map() + filter()に似た使い方

list1 = [i**2 for i in range(5) if i%2 == 1]
print(list1)        # [1, 9]

 

forのネスト

list1 = []
for x in [0, 10, 20]:
    for y in range(3):
        list1.append(x+y)
print(list1)  # [0, 1, 2, 10, 11, 12, 20, 21, 22]

 
これをリスト内包表記で書くと

list1 =[x+y for x in [0, 10, 20] for y in range(3)]
print(list1)  #[0, 1, 2, 10, 11, 12, 20, 21, 22]

 

内包表記の利用例

・1, 2, 3から2つ並べる順列(permutation)

list1 = [(x, y) for x in [1, 2, 3] for y in [1, 2, 3] if x!=y]
print(list1)  # [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]

 
・1,2,3から2つ選ぶ組み合わせ(combination)

list1 = [(x, y) for x in [1, 2, 3] for y in [1, 2, 3] if x<y]
print(list1)  # [(1, 2), (1, 3), (2, 3)]

 
・行列の次数下げ(flatten)

matrix = [[1,2,3], [4,5,6], [7,8,9]]
list1 = [num for row in matrix for num in row]
print(list1) # [1, 2, 3, 4, 5, 6, 7, 8, 9]

 
・2つのリストの操作

list1 = [1, 2, 3]
list2 = [4, 5, 6]
print([x * y for x in list1 for y in list2])    # [4, 5, 6, 8, 10, 12, 12, 15, 18]
print([list1[i] * list2[i] for i in range(3)])  # [4, 10, 18]
print([i*j for (i,j) in zip(list1, list2)])     # [4, 10, 18]

 
・かけ算九九の表

list1 = [[x * y for y in range(1,10)]  for x in range(1,10)]
print(list1)
# [[1, 2, 3, 4, 5, 6, 7, 8, 9], [2, 4, 6, 8, 10, 12, 14, 16, 18],…

 
・ネストしている内側を操作

list1 = [[y * 2 for y in x] for x in [[1,2],[2,3]]]
print(list1) # [[2, 4], [4, 6]]

 
・行列の転置(transpose)

maps = [[1, 2], [3, 4], [5, 6]]
transposed = [[row[i] for row in maps] for i in range(len(maps[0]))]
print(transposed)  # [[1, 3, 5], [2, 4, 6]]

 
・コドン表を作る

bases = "UCAG"
codons = [b1+b2+b3 for b1 in bases for b2 in bases for b3 in bases]
aminoacids = "FFLLSSSSYY**CC*WLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG"
codon_dict = dict(zip(codons, aminoacids))
print(codon_dict)
# {'UCA': 'S', 'AUC': 'I', 'GAC': 'D', 'ACA': 'T', ...

 

テストデータ(4) 常用漢字

常用漢字のテストデータです。
 

data = [""]*7

#小1
data[0] = """
一右雨円王音下火花貝学気九休玉金空月犬見五口校左三山子四糸字耳七
車手十出女小上森人水正生青夕石赤千川先早草足村大男竹中虫町天田土
二日入年白八百文木本名目立力林六"""

#小2
data[1] = """
引羽雲園遠何科夏家歌画回会海絵外角楽活間丸岩顔汽記帰弓牛魚京強教
近兄形計元言原戸古午後語工公広交光考行高黄合谷国黒今才細作算止市
矢姉思紙寺自時室社弱首秋週春書少場色食心新親図数西声星晴切雪船線
前組走多太体台地池知茶昼長鳥朝直通弟店点電刀冬当東答頭同道読内南
肉馬売買麦半番父風分聞米歩母方北毎妹万明鳴毛門夜野友用曜来里理話
"""

#小3
data[2] = """
悪安暗医委意育員院飲運泳駅央横屋温化荷界開階寒感漢館岸起期客究急
級宮球去橋業曲局銀区苦具君係軽血決研県庫湖向幸港号根祭皿仕死使始
指歯詩次事持式実写者主守取酒受州拾終習集住重宿所暑助昭消商章勝乗
植申身神真深進世整昔全相送想息速族他打対待代第題炭短談着注柱丁帳
調追定庭笛鉄転都度投豆島湯登等動童農波配倍箱畑発反坂板皮悲美鼻筆
氷表秒病品負部服福物平返勉放味命面問役薬由油有遊予羊洋葉陽様落流
旅両緑礼列練路和"""

#小4
data[3] = """
愛案以衣位囲胃印英栄塩億加果貨課芽改械害街各覚完官管関観願希季紀
喜旗器機議求泣救給挙漁共協鏡競極訓軍郡径型景芸欠結建健験固功好候
航康告差菜最材昨札刷殺察参産散残士氏史司試児治辞失借種周祝順初松
笑唱焼象照賞臣信成省清静席積折節説浅戦選然争倉巣束側続卒孫帯隊達
単置仲貯兆腸低底停的典伝徒努灯堂働特得毒熱念敗梅博飯飛費必票標不
夫付府副粉兵別辺変便包法望牧末満未脈民無約勇要養浴利陸良料量輪類
令冷例歴連老労録"""

#小5
data[4] = """
圧移因永営衛易益液演応往桜恩可仮価河過賀快解格確額刊幹慣眼基寄規
技義逆久旧居許境均禁句群経潔件券険検限現減故個護効厚耕鉱構興講混
査再災妻採際在財罪雑酸賛支志枝師資飼示似識質舎謝授修述術準序招承
証条状常情織職制性政勢精製税責績接設舌絶銭祖素総造像増則測属率損
退貸態団断築張提程適敵統銅導徳独任燃能破犯判版比肥非備俵評貧布婦
富武復複仏編弁保墓報豊防貿暴務夢迷綿輸余預容略留領"""

#小6
data[5] = """
異遺域宇映延沿我灰拡革閣割株干巻看簡危机揮貴疑吸供胸郷勤筋系敬警
劇激穴絹権憲源厳己呼誤后孝皇紅降鋼刻穀骨困砂座済裁策冊蚕至私姿視
詞誌磁射捨尺若樹収宗就衆従縦縮熟純処署諸除将傷障城蒸針仁垂推寸盛
聖誠宣専泉洗染善奏窓創装層操蔵臓存尊宅担探誕段暖値宙忠著庁頂潮賃
痛展討党糖届難乳認納脳派拝背肺俳班晩否批秘腹奮並陛閉片補暮宝訪亡
忘棒枚幕密盟模訳郵優幼欲翌乱卵覧裏律臨朗論"""

#中学
data[6] = """
亜哀挨曖握扱宛嵐依威為畏尉萎偉椅彙違維慰緯壱逸茨芋咽姻淫陰隠韻唄
鬱畝浦詠影鋭疫悦越謁閲炎怨宴媛援煙猿鉛縁艶汚凹押旺欧殴翁奥岡憶臆
虞乙俺卸穏佳苛架華菓渦嫁暇禍靴寡箇稼蚊牙瓦雅餓介戒怪拐悔皆塊楷潰
壊懐諧劾崖涯慨蓋該概骸垣柿核殻郭較隔獲嚇穫岳顎掛潟括喝渇葛滑褐轄
且釜鎌刈甘汗缶肝冠陥乾勘患貫喚堪換敢棺款閑勧寛歓監緩憾還環韓艦鑑
含玩頑企伎岐忌奇祈軌既飢鬼亀幾棋棄毀畿輝騎宜偽欺儀戯擬犠菊吉喫詰
却脚虐及丘朽臼糾嗅窮巨拒拠虚距御凶叫狂享況峡挟狭恐恭脅矯響驚仰暁
凝巾斤菌琴僅緊錦謹襟吟駆惧愚偶遇隅串屈掘窟熊繰勲薫刑茎契恵啓掲渓
蛍傾携継詣慶憬稽憩鶏迎鯨隙撃桁傑肩倹兼剣拳軒圏堅嫌献遣賢謙鍵繭顕
懸幻玄弦舷股虎孤弧枯雇誇鼓錮顧互呉娯悟碁勾孔巧甲江坑抗攻更拘肯侯
恒洪荒郊香貢控梗喉慌硬絞項溝綱酵稿衡購乞拷剛傲豪克酷獄駒込頃昆恨
婚痕紺魂墾懇佐沙唆詐鎖挫采砕宰栽彩斎債催塞歳載埼剤崎削柵索酢搾錯
咲刹拶撮擦桟惨傘斬暫旨伺刺祉肢施恣脂紫嗣雌摯賜諮侍滋慈餌璽鹿軸叱
疾執湿嫉漆芝赦斜煮遮邪蛇酌釈爵寂朱狩殊珠腫趣寿呪需儒囚舟秀臭袖羞
愁酬醜蹴襲汁充柔渋銃獣叔淑粛塾俊瞬旬巡盾准殉循潤遵庶緒如叙徐升召
匠床抄肖尚昇沼宵症祥称渉紹訟掌晶焦硝粧詔奨詳彰憧衝償礁鐘丈冗浄剰
畳縄壌嬢錠譲醸拭殖飾触嘱辱尻伸芯辛侵津唇娠振浸紳診寝慎審震薪刃尽
迅甚陣尋腎須吹炊帥粋衰酔遂睡穂随髄枢崇据杉裾瀬是井姓征斉牲凄逝婿
誓請醒斥析脊隻惜戚跡籍拙窃摂仙占扇栓旋煎羨腺詮践箋潜遷薦繊鮮禅漸
膳繕狙阻租措粗疎訴塑遡礎双壮荘捜挿桑掃曹曽爽喪痩葬僧遭槽踪燥霜騒
藻憎贈即促捉俗賊遜汰妥唾堕惰駄耐怠胎泰堆袋逮替滞戴滝択沢卓拓託濯
諾濁但脱奪棚誰丹旦胆淡嘆端綻鍛弾壇恥致遅痴稚緻畜逐蓄秩窒嫡沖抽衷
酎鋳駐弔挑彫眺釣貼超跳徴嘲澄聴懲勅捗沈珍朕陳鎮椎墜塚漬坪爪鶴呈廷
抵邸亭貞帝訂逓偵堤艇締諦泥摘滴溺迭哲徹撤添塡殿斗吐妬途渡塗賭奴怒
到逃倒凍唐桃透悼盗陶塔搭棟痘筒稲踏謄藤闘騰洞胴瞳峠匿督篤栃凸突屯
豚頓貪鈍曇丼那奈梨謎鍋軟尼弐匂虹尿妊忍寧捻粘悩濃把覇婆罵杯排廃輩
培陪媒賠伯拍泊迫剝舶薄漠縛爆箸肌鉢髪伐抜罰閥氾帆汎伴阪畔般販斑搬
煩頒範繁藩蛮盤妃彼披卑疲被扉碑罷避尾眉微膝肘匹泌姫漂苗描猫浜賓頻
敏瓶扶怖阜附訃赴浮符普腐敷膚賦譜侮舞封伏幅覆払沸紛雰噴墳憤丙併柄
塀幣弊蔽餅壁璧癖蔑偏遍哺捕舗募慕簿芳邦奉抱泡胞俸倣峰砲崩蜂飽褒縫
乏忙坊妨房肪某冒剖紡傍帽貌膨謀頰朴睦僕墨撲没勃堀奔翻凡盆麻摩磨魔
昧埋膜枕又抹慢漫魅岬蜜妙眠矛霧娘冥銘滅免麺茂妄盲耗猛網黙紋冶弥厄
躍闇喩愉諭癒唯幽悠湧猶裕雄誘憂融与誉妖庸揚揺溶腰瘍踊窯擁謡抑沃翼
拉裸羅雷頼絡酪辣濫藍欄吏痢履璃離慄柳竜粒隆硫侶虜慮了涼猟陵僚寮療
瞭糧厘倫隣瑠涙累塁励戻鈴零霊隷齢麗暦劣烈裂恋廉錬呂炉賂露弄郎浪廊
楼漏籠麓賄脇惑枠湾腕"""

pandasの使い方(2) DataFrameの生成

データフレームを作る(1) numpyの配列から作る。

import numpy as np
import pandas as pd
a = np.random.randint(1, 100, (3, 2))
frame = pd.DataFrame(a, columns=["a", "b"])
print(frame)
#     a   b
# 0  85  80
# 1  85  10
# 2  17  38

 

データフレームを作る(2)リストから

import numpy as np
import pandas as pd

d =[[1, 2, 3], 
    [50, 60, 70]]
frame = pd.DataFrame(d)

print(frame)
#     0   1   2
# 0   1   2   3
# 1  50  60  70

print(frame.T)
#    0   1
# 0  1  50
# 1  2  60
#2  3  70

column名(列名)、index名(行名)が自動で割り振られる。
.Tで行列変換(転置)
 

データフレームを作る(3)辞書から

data = {"year": [2010, 2011, 2012, 2013],
        "pref":["千葉", "山口", "岐阜", "東京"]}

f = pd.DataFrame(data)
print(f)
#   pref  year
# 0   千葉  2010
# 1   山口  2011
# 2   岐阜  2012
# 3   東京  2013

 
columnsを指定しないと、昇順になる。
columns指定で、存在しない列はNaNとなる。

f = pd.DataFrame(data, columns=["year", "pref", "count"])
print(f)
#    year pref count
# 0  2010   千葉   NaN
# 1  2011   山口   NaN
# 2  2012   岐阜   NaN
# 3  2013   東京   NaN

 
・ネストした辞書からDataFrameを作ると、外側のキーがcolumnに
 内側のキーが行indexになる。

data = {"year": {"1st":2010, "2nd":2011, "3rd":2012, "4th":2013},
        "pref": {"1st":"千葉", "2nd":"山口", "3rd":"岐阜"}}
f = pd.DataFrame(data)
print(f)
#    pref  year
# 1st   千葉  2010
# 2nd   山口  2011
# 3rd   岐阜  2012
# 4th  NaN  2013

 

データフレームを作る(4)Webから

 こちらの記事
pandasの使い方(4)ファイルの読み込み - Remrinのpython攻略日記
を参照 
 

データフレームを作る(5)コピー

d2 = d.copy()

 

データ構造の確認

# 行数の確認
print(len(frame))    #2

# 次元数の確認
print(frame.shape)   #(2, 3)

# 各列の基礎統計量の確認
print(frame.describe()) #データ数、平均、標準偏差、4分位
#                A          B          C
# count   2.000000   2.000000   2.000000 データ数
# mean   25.500000  31.000000  36.500000 平均
# std    34.648232  41.012193  47.376154 標準偏差
# min     1.000000   2.000000   3.000000 最小
# 25%    13.250000  16.500000  19.750000 
# 50%    25.500000  31.000000  36.500000
# 75%    37.750000  45.500000  53.250000
# max    50.000000  60.000000  70.000000 最大

# 先頭・末端行の表示
print(frame.head(1)) #先頭の1行を確認
#        A  B  C
# order  1  2  3
print(frame.tail(1)) #末端の1行を確認
#         A   B   C
#  point  50  60  70

print(frame.info()) #構造の確認
# <class 'pandas.core.frame.DataFrame'>
# Index: 2 entries, order to point
# Data columns (total 3 columns):
# A    2 non-null int64
# B    2 non-null int64
# C    2 non-null int64
# dtypes: int64(3)
# memory usage: 56.0+ bytes
# None

 

値の確認

d =[[1, 2, 3],[50, 60, 70]]
frame = pd.DataFrame(d)
print(frame.columns) #RangeIndex(start=0, stop=3, step=1)
print(frame.index)   #RangeIndex(start=0, stop=2, step=1)
print(frame.values)  #値のみの表示→NumPyのndarray
# [[ 1  2  3]
#  [50 60 70]]

 
○特定の行、列の取得

f["A"] A列をSeriesとして取り出す
f.A A列をSeriesとして取り出す
f[0:2] 0~2行
f[:2] 0~2行
f["Jan":"Feb"] Jan~Febの行
f.loc["Jan"] Janの行
f.loc[:, ["A", "B"]] AとBの列
f.loc["Jan":"Feb",["A", "B"]] Jan~Febの行のAとB
f.iloc[0] 0行目
f.iloc[0][0] 0行目の0列目
f.iloc[[1, 2],[0, 1]] 1, 2行目の0,1列
f.iloc[1:2, :] 1~2行目のすべての列
f.iloc[:, 0:1] すべての行の0~1列
f[f.A > 5] Aの値が5より大きいすべての行
f.[f > 5] 5より大きいすべての要素、他はNaN
f[f["A"].isin([5, 10])] A列が5の値を持つ行。isinの引数はリスト型

 

data = [[0, 1, 2, 3], 
        [5, 6, 7, 8], 
        [10, 10, 10, 10]]      
f = pd.DataFrame(data)
f.index = ["Jan", "Feb", "Mar"]
f.columns = ["A", "B", "C", "D"]

print(f)
#       A   B   C   D
# Jan   0   1   2   3
# Feb   5   6   7   8
# Mar  10  10  10  10

print(f["A"])
# Jan     0
# Feb     5
# Mar    10
# Name: A, dtype: int64

print(f.A)
# Jan     0
# Feb     5
# Mar    10
# Name: A, dtype: int64

print(f[0:2])
#      A  B  C  D
# Jan  0  1  2  3
# Feb  5  6  7  8

#print(f[0]) # KeyError: 0

print(f["Jan":"Feb"])
# Jan  0  1  2  3
# Feb  5  6  7  8

#print(f["Jan"]) # KeyError: 'Jan'

print(f.loc["Jan"]) # 縦に表示
# A    0
# B    1
# C    2
# D    3
# Name: Jan, dtype: int64

print(f.loc["Jan":"Feb", ["A", "B"]])
#      A  B
# Jan  0  1
# Feb  5  6

print(f[f > 5])
#         A     B     C     D
# Jan   NaN   NaN   NaN   NaN
# Feb   NaN   6.0   7.0   8.0
# Mar  10.0  10.0  10.0  10.0

print(f[f["A"].isin([5, 10])])
#       A   B   C   D
# Feb   5   6   7   8
# Mar  10  10  10  10

 
参考:
Python Pandasでのデータ操作の初歩まとめ
Pandas でデータフレームを作ってみよう

テストデータ(3) アミノ酸 コドン表

m-RNAからアミノ酸へのコドン表
 

bases = "UCAG"
codons = [b1+b2+b3 for b1 in bases for b2 in bases for b3 in bases]
aminoacids = "FFLLSSSSYY**CC*WLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG"
codon_dict = dict(zip(codons, aminoacids))
print(codon_dict)

#sort to display   
s = sorted([(k, v) for k,v in codon_dict.items()], key=lambda x:codons.index(x[0]))
for i, ele in enumerate(s):
    print("'{}':'{}', ".format(ele[0], ele[1]), "\n"*(i%4 == 3), end="")

 
コドン表

codon_dict={
'UUU':'F',  'UUC':'F',  'UUA':'L',  'UUG':'L',  
'UCU':'S',  'UCC':'S',  'UCA':'S',  'UCG':'S',  
'UAU':'Y',  'UAC':'Y',  'UAA':'*',  'UAG':'*',  
'UGU':'C',  'UGC':'C',  'UGA':'*',  'UGG':'W',  
'CUU':'L',  'CUC':'L',  'CUA':'L',  'CUG':'L',  
'CCU':'P',  'CCC':'P',  'CCA':'P',  'CCG':'P',  
'CAU':'H',  'CAC':'H',  'CAA':'Q',  'CAG':'Q',  
'CGU':'R',  'CGC':'R',  'CGA':'R',  'CGG':'R',  
'AUU':'I',  'AUC':'I',  'AUA':'I',  'AUG':'M',  
'ACU':'T',  'ACC':'T',  'ACA':'T',  'ACG':'T',  
'AAU':'N',  'AAC':'N',  'AAA':'K',  'AAG':'K',  
'AGU':'S',  'AGC':'S',  'AGA':'R',  'AGG':'R',  
'GUU':'V',  'GUC':'V',  'GUA':'V',  'GUG':'V',  
'GCU':'A',  'GCC':'A',  'GCA':'A',  'GCG':'A',  
'GAU':'D',  'GAC':'D',  'GAA':'E',  'GAG':'E',  
'GGU':'G',  'GGC':'G',  'GGA':'G',  'GGG':'G'}

 

1 letter 3 letters 英語名 日本語名
A Ala Alanine ラニ
C Cys Cysteine システイン
D Asp Aspartic Acid アスパラギン
E Glu Glutamic Acid グルタミン酸
F Phe Phenylalanine フェニルアラニン
G Gly Glycine グリシン
H His Histidine ヒスチジン
I Ile Isoleucine イソロイシン
K Lys Lysine リジン
L Leu Leucine ロイシン
M Met Methionine メチオニン
N Asn Asparagine アスパラギン
P Pro Proline プロリン
Q Gln Glutamine グルタミン
R Arg Arginine アルギニン
S Ser Serine セリン
T Thr Threonine スレオニン
V Val Valine バリン
W Trp Tryptophan トリプトファン
Y Tyr Tyrosine チロシン

 
・開始コドン
 AUGはメチオニンを指定するが、同時に開始コドンにもなっている、
 タンパク質合成が完了すると最初のメチオニンは切り離される。
 
・終止コドン
 UAA, UAG, UGA
 
・タンパク質合成
 DNA→(転写)→m-RNA前駆体→(スプライシング)→m-RNA→(翻訳)→タンパク質

参考:
Pythonで辞書の初期値をまとめて登録する方法 | Nana-Korobi