Remrinのpython攻略日記

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

テストデータ(6) メフィスト賞

メフィスト賞
 

import pandas as pd

url = 'http://python-remrin.hatenadiary.jp/entry/2017/05/10/222443'
## DataFrameのリストを得る。header=0のオプション指定で、最初の行をheader扱い。
fetched = pd.io.html.read_html(url)
print(len(fetched))  # listの要素であるDataFrameの個数
df = fetched[0]

# 2次元リスト化
data = []
for i in range(len(df)):
    x = []
    for j in range(len(df.iloc[0])):
        x.append(df.iloc[i, j])
    data.append(x)
print(data)

# hatena表組み化
for i in range(len(df)):
    s = "|"
    for j in range(len(df.iloc[0])):
        s += str(df.iloc[i, j]) + "|"
    print(s)

 

回数 作品名 著者名
1 すべてがFになる 森博嗣
2 コズミック 清涼院流水
3 六枚のとんかつ 蘇部健一
4 Jの神話 乾くるみ
5 記憶の果て 浦賀和宏
6 歪んだ創世記 積木鏡介
7 血塗られた神話 新堂冬樹
8 ダブ(エ)ストン街道 浅暮三文
9 QED 百人一首の呪 高田崇史
10 Kの流儀 中島望
11 銀の檻を溶かして 高里椎奈
12 ドッペルゲンガー 霧舎巧
13 ハサミ男 殊能将之
14 UNKNOWN 古処誠二
15 真っ暗な夜明け 氷川透
16 ウェディング・ドレス 黒田研二
17 火蛾 古泉迦十
18 日曜日の沈黙 石崎幸二
19 煙か土か食い物 舞城王太郎
20 月長石の魔犬 秋月涼介
21 フリッカー式 鏡公彦にうってつけの殺人 佐藤友哉
22 DOOMSDAY 審判の夜 津村巧
23 クビキリサイクル 青色サヴァンと戯れ言遣い 西尾維新
24 『クロック』城殺人事件 北山猛邦
25 それでも警官は微笑う 日明恩
26 死都日本 石黒耀
27 フレームアウト 生垣真太郎
28 蜜の森の凍える女神 関田涙
29 空を見上げる古い歌を口ずさむ 小路幸也
30 極限推理コロシアム 矢野龍王
31 冷たい校舎の時は止まる 辻村深月
32 孤虫症 真梨幸子
33 黙過の代償 森山赳志
34 少女は踊る暗い腹の中踊る 岡崎隼人
35 天帝のはしたなき果実 古野まほろ
36 ウルチモ・トルッコ 犯人はあなただ! 深水黎一郎
37 パラダイス・クローズド THANATO 汀こるもの
38 掘割で笑う女 浪人左門あやかし指南 輪渡颯介
39 マネーロード 二郎遊真
40 無貌伝 双児の子ら 望月守宮
41 虫とりのうた 赤星香一郎
42 プールの底に眠る 白河三兎
43 キョウカンカク 天祢涼
44 琅邪の鬼 丸山天寿
45 図書館の魔女 高田大介
46 恋都の狐さん 北夏輝
47 眼球堂の殺人 The Book 周木律
48 愛の徴 天国の方角 近本洋一
49 渦巻く回廊の鎮魂曲 冷媒探偵アーネスト 風森章羽
50 ○○○○○○○○殺人事件 早坂吝
51 恋と禁忌の述語論理 井上真偽
52 誰かが見ている 宮西真冬

テストデータ(5) 直木賞

直木賞

import pandas as pd
url = 'http://python-remrin.hatenadiary.jp/entry/2017/05/10/215715'
## DataFrameのリストを得る。header=0のオプション指定で、最初の行をheader扱い
fetched = pd.io.html.read_html(url)
print(len(fetched))  # 1   listの要素であるDataFrameの個数
df = fetched[0]

# 2次元リスト化
data = []
for i in range(len(df)):
    x = []
    for j in range(len(df.iloc[0])):
        x.append(df.iloc[i, j])
    data.append(x)
print(data)

# hatena表組み化
for i in range(len(df)):
    s = "|"
    for j in range(len(df.iloc[0])):
        s += str(df.iloc[i, j]) + "|"
    print(s)

 
直木賞

作者 作品
156回(2016年下半期) 恩田陸 蜂蜜と遠雷
155回(2016年上半期) 荻原浩 海の見える理髪店
154回(2015年下半期) 青山文平 つまをめとらば
153回(2015年上半期) 東山彰良
152回(2014年下半期) 西加奈子 サラバ!
151回(2014年上半期) 黒川博行 破門
150回(2013年下半期) 朝井まかて 恋歌
150回(2013年下半期) 姫野カオルコ 昭和の犬
149回(2013年上半期) 桜木紫乃 ホテルローヤル
148回(2012年下半期) 安部龍太郎 等伯
148回(2012年下半期) 朝井リョウ 何者
147回(2012年上半期) 辻村深月 鍵のない夢を見る
146回(2011年下半期) 葉室麟 蜩ノ記
145回(2011年上半期) 池井戸潤 下町ロケット
144回(2010年下半期) 木内 昇 漂砂のうたう
144回(2010年下半期) 道尾秀介 月と蟹
143回(2010年上半期) 中島京子 小さいおうち
142回(2009年下半期) 白石一文 ほかならぬ人へ
142回(2009年下半期) 佐々木譲 廃墟に乞う
141回(2009年上半期) 北村薫 鷺と雪
140回(2008年下半期) 天童荒太 悼む人
140回(2008年下半期) 山本兼一 利休にたずねよ
139回(2008年上半期) 井上荒野 切羽へ
138回(2007年下半期) 桜庭一樹 私の男
137回(2007年上半期) 松井今朝子 吉原手引草
136回(2006年下半期) - -
135回(2006年上半期) 三浦しをん まほろ駅前多田便利軒
135回(2006年上半期) 森絵都 風に舞いあがるビニールシート
134回(2005年下半期) 東野圭吾 容疑者Xの献身
133回(2005年上半期) 朱川湊人 花まんま
132回(2004年下半期) 角田光代 対岸の彼女
131回(2004年上半期) 奥田英朗 空中ブランコ
131回(2004年上半期) 熊谷達也 邂逅の森
130回(2003年下半期) 江國香織 号泣する準備はできていた
130回(2003年下半期) 京極夏彦 後巷説百物語
129回(2003年上半期) 石田衣良 4TEEN
129回(2003年上半期) 村山由佳 星々の舟
128回(2002年下半期) - -
127回(2002年上半期) 乙川優三郎 生きる
126回(2001年下半期) 山本一力 あかね空
126回(2001年下半期) 唯川恵 肩ごしの恋人
125回(2001年上半期) 藤田宜永 愛の領分
124回(2000年下半期) 重松清 ビタミンF
124回(2000年下半期) 山本文緒 プラナリア
123回(2000年上半期) 金城一紀 GO
123回(2000年上半期) 船戸与一 虹の谷の五月
122回(1999年下半期) なかにし礼 長崎ぶらぶら節
121回(1999年上半期) 佐藤賢一 王妃の離婚
121回(1999年上半期) 桐野夏生 柔らかな頬
120回(1998年下半期) 宮部みゆき 理由
119回(1998年上半期) 車谷長吉 赤目四十八瀧心中未遂
118回(1997年下半期) - -
117回(1997年上半期) 篠田節子 女たちのジハード
117回(1997年上半期) 浅田次郎 鉄道員(ぽっぽや)
116回(1996年下半期) 坂東眞砂子 山妣
115回(1996年上半期) 乃南アサ 凍える牙
114回(1995年下半期) 小池真理子
114回(1995年下半期) 藤原伊織 テロリストのパラソル
113回(1995年上半期) 赤瀬川隼 白球残映
112回(1994年下半期) - -
111回(1994年上半期) 海老沢泰久 帰郷
111回(1994年上半期) 中村彰彦 二つの山河
110回(1993年下半期) 大沢在昌 新宿鮫 無間人形
110回(1993年下半期) 佐藤雅美 恵比寿屋喜兵衛手控え
109回(1993年上半期) 高村薫 マークスの山
109回(1993年上半期) 北原亞以子 恋忘れ草
108回(1992年下半期) 出久根達郎 佃島ふたり書房
107回(1992年上半期) 伊集院静 受け月
106回(1991年下半期) 高橋克彦 緋い記憶
106回(1991年下半期) 高橋義夫 狼奉行
105回(1991年上半期) 芦原すなお 青春デンデケデケデケ
105回(1991年上半期) 宮城谷昌光 夏姫春秋
104回(1990年下半期) 古川薫 漂泊者のアリア
103回(1990年上半期) 泡坂妻夫 蔭桔梗
102回(1989年下半期) 原【りょう】 私が殺した少女
102回(1989年下半期) 星川清司 小伝抄
101回(1989年上半期) 笹倉明 遠い国からの殺人者
101回(1989年上半期) ねじめ正一 高円寺純情商店街
100回(1988年下半期) 杉本章子 東京新大橋雨中図
100回(1988年下半期) 藤堂志津子 熟れてゆく夏
99回(1988年上半期) 景山民夫 遠い海から来たCOO
99回(1988年上半期) 西木正明 凍れる瞳・端島の女
98回(1987年下半期) 阿部牧郎 それぞれの終楽章
97回(1987年上半期) 山田詠美 ソウル・ミュージック ラバーズ・オンリー
97回(1987年上半期) 白石一郎 海狼伝
96回(1986年下半期) 逢坂剛 カディスの赤い星
96回(1986年下半期) 常盤新平 遠いアメリカ
95回(1986年上半期) 皆川博子 恋紅
94回(1985年下半期) 林真理子 最終便に間に合えば・京都まで
94回(1985年下半期) 森田誠吾 魚河岸ものがたり
93回(1985年上半期) 山口洋子 演歌の虫・老梅
92回(1984年下半期) - -
91回(1984年上半期) 連城三紀彦 恋文
91回(1984年上半期) 難波利三 てんのじ村
90回(1983年下半期) 高橋治 秘伝
90回(1983年下半期) 神吉拓郎 私生活
89回(1983年上半期) 胡桃沢耕史 黒パン俘虜記
88回(1982年下半期) - -
87回(1982年上半期) 村松友視 時代屋の女房
87回(1982年上半期) 深田祐介 炎熱商人
86回(1981年下半期) つかこうへい 蒲田行進曲
86回(1981年下半期) 光岡明 機雷
85回(1981年上半期) 青島幸男 人間万事塞翁が丙午
84回(1980年下半期) 中村正軌 元首の謀叛
83回(1980年上半期) 志茂田景樹 黄色い牙
83回(1980年上半期) 向田邦子 花の名前・かわうそ・犬小屋
82回(1979年下半期) - -
81回(1979年上半期) 阿刀田高 ナポレオン狂
81回(1979年上半期) 田中小実昌 浪曲師朝日丸の話・ミミのこと
80回(1978年下半期) 有明夏夫 大浪花諸人往来
80回(1978年下半期) 宮尾登美子 一絃の琴
79回(1978年上半期) 色川武大 離婚
79回(1978年上半期) 津本陽 深重の海
78回(1977年下半期) - -
77回(1977年上半期) - -
76回(1976年下半期) 三好京三 子育てごっこ
75回(1976年上半期) - -
74回(1975年下半期) 佐木隆三 復讐するは我にあり
73回(1975年上半期) - -
72回(1974年下半期) 半村良 雨やどり
72回(1974年下半期) 井出孫六 アトラス伝説
71回(1974年上半期) 藤本義一 鬼の詩
70回(1973年下半期) - -
69回(1973年上半期) 長部日出雄 津軽世去れ節・津軽じょんから節
69回(1973年上半期) 藤沢周平 暗殺の年輪
68回(1972年下半期) - -
67回(1972年上半期) 井上ひさし 手鎖心中
67回(1972年上半期) 綱淵謙錠
66回(1971年下半期) - -
65回(1971年上半期) - -
64回(1970年下半期) 豊田穣 長良川
63回(1970年上半期) 渡辺淳一 光と影
63回(1970年上半期) 結城昌治 軍旗はためく下に
62回(1969年下半期) - -
61回(1969年上半期) 佐藤愛子 戦いすんで日が暮れて
60回(1968年下半期) 早乙女貢 僑人の檻
60回(1968年下半期) 陳舜臣 青玉獅子香炉
59回(1968年上半期) - -
58回(1967年下半期) 三好徹 聖少女
58回(1967年下半期) 野坂昭如 アメリカひじき・火垂るの墓
57回(1967年上半期) 生島治郎 追いつめる
56回(1966年下半期) 五木寛之 蒼ざめた馬を見よ
55回(1966年上半期) 立原正秋 白い罌粟
54回(1965年下半期) 新橋遊吉 八百長
54回(1965年下半期) 千葉治平 虜愁記
53回(1965年上半期) 藤井重夫
52回(1964年下半期) 安西篤子 張少子(チャンシャオツ)の話
52回(1964年下半期) 永井路子 炎環
51回(1964年上半期) - -
50回(1963年下半期) 安藤鶴夫 巷談本牧亭
50回(1963年下半期) 和田芳恵 塵の中
49回(1963年上半期) 佐藤得二 女のいくさ
48回(1962年下半期) 山口瞳 江分利満氏の優雅な生活
48回(1962年下半期) 杉本苑子 孤愁の岸
47回(1962年上半期) 杉森久英 天才と狂人の間
46回(1961年下半期) 伊藤桂一 螢の河
45回(1961年上半期) 水上勉 雁の寺
44回(1960年下半期) 黒岩重吾 背徳のメス
44回(1960年下半期) 寺内大吉 はぐれ念仏
43回(1960年上半期) 池波正太郎 錯乱
42回(1959年下半期) 司馬遼太郎 梟の城
42回(1959年下半期) 戸板康二 團十郎切腹事件
41回(1959年上半期) 平岩弓枝 鏨師
41回(1959年上半期) 渡邊喜恵子 馬淵川
40回(1958年下半期) 城山三郎 総会屋錦城
40回(1958年下半期) 多岐川恭 落ちる
39回(1958年上半期) 山崎豊子 花のれん
39回(1958年上半期) 榛葉英治 赤い雪
38回(1957年下半期) - -
37回(1957年上半期) 江崎誠致 ルソンの谷間
36回(1956年下半期) 穂積驚 勝烏
36回(1956年下半期) 今東光 お吟さま
35回(1956年上半期) 今官一 壁の花
35回(1956年上半期) 南條範夫 燈台鬼
34回(1955年下半期) 邱永漢 香港
34回(1955年下半期) 新田次郎 強力伝
33回(1955年上半期) - -
32回(1954年下半期) 梅崎春生 ボロ家の春秋
32回(1954年下半期) 戸川幸夫 高安犬物語
31回(1954年上半期) 有馬頼義 終身未決囚
30回(1953年下半期) - -
29回(1953年上半期) - -
28回(1952年下半期) 立野信之 叛乱
27回(1952年上半期) 藤原審爾 罪な女・その他
26回(1951年下半期) 柴田錬三郎 エスの裔
26回(1951年下半期) 久生十蘭 鈴木主水
25回(1951年上半期) 源氏鶏太 英語屋さん・その他
24回(1950年下半期) 檀一雄 真説石川五右衛門長恨歌
23回(1950年上半期) 今日出海 天皇の帽子
23回(1950年上半期) 小山いと子 執行猶予
22回(1949年下半期) 山田克郎 海の廃園
21回(1949年上半期) 富田常雄 面・刺青
20回(1944年下半期) - -
19回(1944年上半期) 岡田誠三 ニューギニヤ山岳戦
18回(1943年下半期) 森荘已池 山畠・蛾と笹舟
17回(1943年上半期) - -
16回(1942年下半期) 田岡典夫 強情いちご・その他
16回(1942年下半期) 神崎武雄 寛容・その他
15回(1942年上半期) - -
14回(1941年下半期) - -
13回(1941年上半期) 木村荘十 雲南守備兵
12回(1940年下半期) 村上元三 上総風土記・その他
11回(1940年上半期) 堤千代 小指・その他
11回(1940年上半期) 河内仙介 軍事郵便
10回(1939年下半期) - -
9回(1939年上半期) - -
8回(1938年下半期) 大池唯雄 兜首・秋田口の兄弟
7回(1938年上半期) 橘外男 ナリン殿下への回想
6回(1937年下半期) 井伏鱒二 ジョン萬次郎漂流記・その他
5回(1937年上半期) - -
4回(1936年下半期) 木々高太郎 人生の阿呆
3回(1936年上半期) 海音寺潮五郎 天正女合戦・武道傳來記
2回(1935年下半期) 鷲尾雨工 吉野朝太平記
1回(1935年上半期) 川口松太郎 鶴八鶴次郎・風流深川唄

NumPyの使い方(4) 形状変換と転置

NumPyの形状変換と転置について。
 

reshape()、resize()

 タプルでshapeを指定して形状を変換する。
 変換前後で全要素数が一致しないときはValueError
 -1を指定した軸はNumPyが自動で判断。
 もとの配列を参照を得るので、値変更は元の配列に及ぶ。 
 np.resize()だと、コピーを取得するので、値変更をしても元の配列は保存される。
  np.resize()は総要素数が増えた場合は値を繰り返して埋める。
  ndarray.resize()は総要素数が増えたときはゼロで埋める。

import numpy as np

a1 = np.array(range(12))
print(a1)  # [0  1  2  3  4  5  6  7  8  9 10 11 12]

print(a1.reshape(4, 3))
# [[ 0  1  2]
#  [ 3  4  5]
#  [ 6  7  8]
#  [ 9 10 11]]

print(a1.reshape(4, 3).reshape(2, 6))
# [[ 0  1  2  3  4  5]
#  [ 6  7  8  9 10 11]]

print(a1.reshape(6, -1))
# -1を指定した軸は、NumPyが自動で判断
#[[ 0  1]
# [ 2  3]
# [ 4  5]
# [ 6  7]
# [ 8  9]
# [10 11]]

# print(a1.reshape(6, 3))
# ValueError: total size of new array must be unchanged

 

flatten(), ravel()

 1次元の配列へ変換する。
 flatten() 必ずコピーを返す。
 raval()  必要がなければコピーは作らない。
 デフォルトでは行優先だが、列優先にする場合は"F"を引数にする。

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

print(a2.flatten("F"))
# [0 3 6 1 4 7 2 5 8]

 

転置.Tとtranspose()

・2次元配列の行列変換は.T
・transpose()は軸の順序を指定できる。
 
2次元配列のでの例

a1 = np.array(range(8)).reshape(4, 2)
print(a1)
# [[0 1]
#  [2 3]
#  [4 5]
#  [6 7]]

print(a1.T)
# [[0 2 4 6]
#  [1 3 5 7]]

# a1.T と a1 の内積
print(np.dot(a1.T, a1))
# [[56 68]
#  [68 84]]

print(a1.transpose(0, 1))
# 元の配列を同じ形
# [[0 1]
#  [2 3]
#  [4 5]
#  [6 7]]

print(a1.transpose(1, 0))
# 元の配列の0番の軸(行)を1番の軸(縦)に、1番軸を0番に
# [[0 2 4 6]
#  [1 3 5 7]]

 

・transpose(2, 0, 1)とは
 3次元配列で、shapeが(元の2番軸, 元の0番軸, 元の1番軸)にすることを表す。
 
3次元配列での例

a1 = np.array(range(24)).reshape(2, 3, 4)
print(a1)
# [[[ 0  1  2  3]
#   [ 4  5  6  7]
#   [ 8  9 10 11]]
#
#  [[12 13 14 15]
#   [16 17 18 19]
#   [20 21 22 23]]]

print(a1.transpose(0, 1, 2))
# 元の配列と同じ
# [[[ 0  1  2  3]
#   [ 4  5  6  7]
#   [ 8  9 10 11]]
#
#  [[12 13 14 15]
#   [16 17 18 19]
#   [20 21 22 23]]]

print(a1.transpose(0, 2, 1))
# 最も外側の次元は変えずに内側の行と列を入れ替える
# shapeは(2, 4, 3)となる。
# [[[ 0  4  8]
#   [ 1  5  9]
#   [ 2  6 10]
#   [ 3  7 11]]
#
#  [[12 16 20]
#   [13 17 21]
#   [14 18 22]
#   [15 19 23]]]

print(a1.transpose(1, 0, 2))
# transpose(1, 0, 2)とは、shapeが(元の1番軸、元の0番軸、元の2番軸)
# 列は変えずに、行と外側を入れ替えて、shapeは(3, 2, 4)となる。
# [[[ 0  1  2  3]
#   [12 13 14 15]]
#
#  [[ 4  5  6  7]
#   [16 17 18 19]]
#
#  [[ 8  9 10 11]
#   [20 21 22 23]]]

 
・3次元配列の軸の方向に注意
f:id:rare_Remrin:20170513132338p:plain
 

swapaxes()

・swapaxes()で特定の2つの軸を入れかれられる。
 「axes」は「axis」の複数形。
 3次元配列でswapaxes(0, 2)だと、0番軸と2番軸を交換する。
 つまり、transpose(2, 1, 0)と同義

 2次元配列での転置.Tは、swapaxes(1, 0)と同義。

print(a1.swapaxes(0, 1))  # transpose(1, 0, 2)と同義
# [[[ 0  1  2  3]
#   [12 13 14 15]]
#
#  [[ 4  5  6  7]
#   [16 17 18 19]]
#
#  [[ 8  9 10 11]
#   [20 21 22 23]]]

 

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', ...