テストデータ(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 | パラダイス・クローズド THANATOS | 汀こるもの |
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次元配列の軸の方向に注意
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', ...