読者です 読者をやめる 読者になる 読者になる

St_Hakky’s blog

心理学/人事/就活/留学/データサイエンス/バイオインフォマティクス/日頃思ったことについて書きます。

Effective python シリーズ6:Avoid Using start, end, and stride in a Single Slice

こんにちは。

○読んでいる本

以下の本を勉強がてら読んでいます。

www.effectivepython.com

ここにある通り、Pythonプログラムを改良する59項目が掲載されています。詳細は本に書かれているので、それを読めば良しとして、大事そうなところと、これに関連して勉強したことを書きます。

まとめページは以下より。

st-hakky.hatenablog.com


さて、今回は6つ目:「Avoid Using start, end, and stride in a Single Slice」をやります。

○Avoid Using start, end, and stride in a Single Slice

はい、これですね。前回のエントリで僕が堂々とメモ書きしていたやつをやめなさいと言われていますね笑

■somelist[start:end:stride]

前回のエントリ以外にも、Pythonでは、リストをstartからendまでstrideずつ取ってくるという機能があり、例えば増分に2とか指定すると、偶数番目とか奇数番目のデータを取得できたりします。

somelist = ["odd", "even", "odd", "even", "odd", "even", "odd"]
odds = somelist[::2]
evens = somelist[1::2]
print(odds)
print(evens)

上記を実行すると、

['odd', 'odd', 'odd', 'odd']
['even', 'even', 'even']

ってな感じです。

■よくある文字列反転

なんかPythonっぽくて僕は好きなんですが、ぱっと見確かに何やっているかわからないというのはあると思います。笑

somestring[::-1]

これの問題点の一つに、ASCII文字のバイト列にはうまく働くが、UTF-8バイト列で符号化したUnicode文字列にはダメというのがあります。

somestring = "これは動かない"
x = somestring.encode("utf-8")
y = x[::-1]
z = y.decode("utf-8")  # error!!

わかりにくさの観点で行けば、負の値をstartやendに指定しだすと、読みにくくなるというのがあります(詳しくは本参照)。

■問題点まとめ
  • 文字列反転によく使うあれはASCII文字のバイト列はうまくいくけどutf-8バイト列で符号化したUnicode文字列にはダメなので、バグの原因にもなるし別の方法を取ろう(逆に言えばこれ以外の場合は、、)
  • 混乱を避けるために、できるだけ正のstride値を使い(負のstrideは使わない)、startかendのうちどちらか一方のみと一緒に使うようにする。

それでは。

Effective python シリーズ5:Know How to Slice Sequences

こんにちは。少し日が空いてしまいましたが、今日も頑張る。

○読んでいる本

以下の本を勉強がてら読んでいます。

www.effectivepython.com

ここにある通り、Pythonプログラムを改良する59項目が掲載されています。詳細は本に書かれているので、それを読めば良しとして、大事そうなところと、これに関連して勉強したことを書きます。

まとめページは以下より。

st-hakky.hatenablog.com


さて、今回は5つ目:「Know How to Slice Sequences」をやります。

○Know How to Slice Sequences

どうやってシーケンス(list, str, bytes)をスライスできるか知っておけというやつですね。

■スライス構文の基本形

スライスの基本形は、以下のような形で、startの要素が含まれ、endの要素が含まれません。

somelist[start:end]

マイナスとかもよく使うやつですね。

■リストの境界を超えた添え字も適切に扱われて便利

リストの境界を超えたあたいも、適切に表現されるので、かなり便利。

a = [1,2,3,4,5,6,7,8,9,10]
print(a[:20])
print(a[-20:])

上のコードの出力は、どちらも、

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

になるという感じです。

これは入力シーケンスを考慮して最大長を設定したコードも簡単に書けるようになっています。

■代入するスライスの長さは同じでなくていい

これは「へぇー」ってなりました笑(えっ、もしかして常識?いや、こんなコード書くの?笑)

例えば、

a = [1,2,3,4,5,6,7,8,9,10]
a[2:7] = ["a", "b", "c"]
print(a)

とすると、出力は、

[1, 2, 'a', 'b', 'c', 8, 9, 10]

となるという笑。上の例は要素を減らしたパターンだが、要素を増やすパターンでやってみると、つまり、

a = [1,2,3,4,5,6,7,8,9,10]
a[2:3] = ["a", "b", "c", "d", "e"]
print(a)

とすると、

[1, 2, 'a', 'b', 'c', 'd', 'e', 4, 5, 6, 7, 8, 9, 10]

となるという笑。

■代入周りで覚えておきたいこと

これはほんまにいつもややこしいなぁ思う。笑

  • スライスした結果は新しいリストが生成
  • スライスせずに入れると元のリストのコピー
  • コピー後、代入を行うと要素が入れ替わる

以下、それぞれ見ていく。

■スライスした結果は新しいリストが生成

スライス時は新しいリストが生成されるので、元の値を編集しても影響は出ない。つまり、

a = [1,2,3,4,5,6,7,8,9,10]
b = a[4:]
a[6] = "b"
print(a)
print(b)

とすると、以下のようになる(#以降はわかりやすさのために書いた)。

[1, 2, 3, 4, 5, 6, 'b', 8, 9, 10]   # a
[5, 6, 7, 8, 9, 10]  # b
■スライスせずに入れると元のリストのコピー/コピー後、代入を行うと要素が入れ替わる

今度はスライスせずに入れると、元のリストのコピーになる。そのため、代入を何らかの方法で行うと要素が入れ替わることに注意。

これは、immutableかmutableかが問題で、リストはmutableなオブジェクトなので、このようなことが起きるんですね。この辺りは以下を参照。めちゃめちゃわかりやすいです。

qiita.com


対策は上のサイトでも書かれている通り、以下の三つでしのぐしかない。

  • スライスを使う(例:copylist = somelist[:]):浅いコピー
  • copyモジュールのdeepcopy()関数を使う(import copy, copylist = copy.deepcopy(somelist)):深いコピー
  • for内包表記を使う:浅いコピー

浅いコピーの場合だと、以下のサイトで示されている通り、何もかもコピーするわけではなく、リストの中身が何かを参照している時、その参照先自体はコピーされないのです。

参考:Pythonの浅いコピー、深いコピー – HimaJew Blog

そのため、以下のような感じのことがおきます。

p=[1,2,3]
q=[4,5,6]
r=[7,8,9]
 
A=[p,q,r]
B=[x for x in A]
 
A[0][0]="a"
print(A)
print(B)

上記のコードを実行すると、

[['a', 2, 3], [4, 5, 6], [7, 8, 9]]
[['a', 2, 3], [4, 5, 6], [7, 8, 9]]

となりますので要注意ですね。

pythonで文字列反転

よく使うのでメモ。リストでは、list[start:end:step]という感じなんだけどこれをうまく利用するとこうなるってやつ。

somestring[::-1]

参考:Python で文字列反転 - 似非プログラマの覚え書き

でも、これ次の項目でダメって言われているんご笑

「採用学」を読んだ

こんにちは。

「採用学」という本を読んだので、その本についてまとめておく。

○読んだ本:「採用学」

今回読んだのはこの本。


○本の内容と感想

この本は、採用を科学するという立場をとって研究をされている服部先生の本で、中身もできる限り事実を元に説明されているように感じた。「採用」に対する考え方を体系化し、企業が採用を考えるときにどのようにアプローチするべきかというのが、事例なども合わせて紹介されていた。

僕個人としては、採用を行うときに考えるべきポイントは何かという点でこの本を手に取ったし、具体的な手法の普遍化はできなくても体系化まではどの企業にも当てはまるものが作れると思っていたので、その意味でもすごく参考になった。

また、体系化してこれらの理論を作れるようになれば、現在のIoTやデータサイエンスの技術を使えば、
・雇用従事者の離脱予測
・雇用従事者のタスク/コミュニケーション量の観測
・応募者の人物要件の分析、測定
・社内優秀人材の人物要件の定義、測定
などが可能になる(と思っている)。

実際に、少しではあったがそのような取り組みをしている企業の例もあった(Googleとか)ので、またその手の本を読んでみようかなと思う(僕の興味はどっちかっていうとそちらにあるので)。

本の中身で取り上げられていた、以下の式があった。詳しくは本を読む感じで、ここでは深く説明しないけど笑

採用力 = 採用リソース(有形/無形) × 採用デザイン力(採用設計力/オペレーション力)
採用リソース(有形/無形):資金、人員、企業/採用自体のブランド
採用デザイン力:採用プロセスなどを組み立てる力

これはすごく共感する部分があった。掛け算になっているので、中小企業やベンチャー企業といった資金に比較的乏しくなってしまう立場にある企業は、この点で優秀な人材の確保という点では、不利になる。

ここの掛け算をどう解決していくかということが、ポイントになるだろうし、面白い部分でもあり、大型の企業によく見られる採用時のデータ活用を小さい企業に適用するという点で、とても楽しいなぁと思った。

www.works-i.com

HR系のテクノロジーは上のサイトにもあるように発展してきてはいるけれど、まだ人物要件の定義という観点ではアンケートといったレベル感でしかないと思う。中小企業やベンチャー企業においては、どうしても複数業務を兼任するという形になるので、一歩採用力という意味で遅れるし、採用が失敗した時のダメージが大きく出てしまう。

そのため、ここを打開する意味で、人事/採用におけるデータ化/モデル化みたいなところを実現するべきだし、以下の文章にもあるように、そのような例はまだ大手企業が多いようだけど、すでにある。

急発進する人事×データ
http://www.works-i.com/pdf/w136_toku2.pdf


データ、楽しいですね。この本はとても良かったです。他にもこのタイプの本を読んでみようと思います。

それでは。

勾配降下法について調べてまとめてみた

こんにちは。

今までなんとなくなーなーで勉強していたGradient Descentですが、ちゃんと調べて見ました。

OverViewの論文があって(元はブログの投稿なので、これはそうというのかわからないけど)、今回それを読みつついろんな資料を漁る方式で勉強しました。

○読んだ論文とスライド

最近自分で話そうと思ってまとめるといい感じで頭に入ることを学習したので、しっかり読もうと決めたものは資料にしています。笑

■一言まとめ

めんどくさかったら、とりあえずAdam使っとけってことですね笑

○Gradient Descent周りの参考資料の一覧

上記の論文とスライドを読むときに参考になったのが以下の資料です。

■Nadam
■Advanced Strategy of SGD


何か有益な情報やサイトがあれば教えてください笑

それでは。

Effective python シリーズ4:Write Helper Functions Instead of Complex Expressions

こんにちは。

○読んでいる本

以下の本を勉強がてら読んでいます。

www.effectivepython.com

ここにある通り、Pythonプログラムを改良する59項目が掲載されています。詳細は本に書かれているので、それを読めば良しとして、大事そうなところと、これに関連して勉強したことを書きます。

まとめページは以下より。

st-hakky.hatenablog.com


さて、今回は4つ目:「Write Helper Functions Instead of Complex Expressions」をやります。

○Write Helper Functions Instead of Complex Expressions

今回は「あぁ、適当にコード書いているときはよくやりがちがなことだなぁ」って感じの内容でした。

  • 代入する式や処理が1行で書くには複雑になってきたと思ったら、ヘルパー関数を作成した方がいい。
  • 読みやすさで得られる利益は常に、簡潔さがもたらした便益を上回る
  • Pythonは特にそう言った複雑な処理を1行でかけちゃうので、注意していこう

今回はこれで以上で。