【Python】 集合についての操作

# 集合の宣言
a = set([1,2,3])
b = set([3,4,5])

# 和集合
> a | b
{1,2,3,4,5}

# 積集合
> a & b 
{3}

# 集合の差(A-B = A-(A∩B)
> a - b
{1,2}

# 対象差(AもしくはBにのみ含まれる A+B-(A∩B)
> a ^ b
{1,2,4,5}

# 部分集合の判定
> a <= b
False
>{3,4} <= b
True

【注意】
部分集合の判定で{3} in {3,4,5}とやってもFalseとなる.
 3 \in \{3,4,5\}だが \{3\} \not \in \{3,4,5\}だからだ.

リスト型では + は連結として定義されている. -,^,&は定義されていない.<=は定義されている.

【参考】
https://qiita.com/Tocyuki/items/0bc783daab382ef7a0ec

【python】集合型について

集合型set()について

# 集合の宣言(1)
a = set([1,2,3])
# 集合の宣言(2)
a = {1,2,3}
# 空集合の宣言
> a = set()
# 追加
> a.add(1)
# 削除
> a.remove(1)
# 無い要素を削除するとエラー
> a.remove(2)
Traceback (most recent call last):
  File "<sttdin>", line 1, in <module>
KeyError: 2
# discardによるエラーを発生させない削除
> a.discard(100)

つまり集合から要素を削除する際にremove()メソッドを使うと例外処理をする必要がある.
discard()メソッドを使うとエラー処理せずに済む.

# 集合から偶数を除く操作
a = set([1,6,7])
for i in range(0,10,2):
   try:
      a.remove(i)
   except:
      pass

b = set([1,6,7])
for i in range(0,10,2):
    b.discard(i)

【参考】
https://www.sejuku.net/blog/21923#addset

【ギャラリー】 k-meansによる画像減色

元画像
f:id:umashika5555:20171103122400j:plain
k=3
f:id:umashika5555:20171103122417p:plain
k=5
f:id:umashika5555:20171103122422p:plain
k=7
f:id:umashika5555:20171103122425p:plain
k=10
f:id:umashika5555:20171103122557p:plain
k=12
f:id:umashika5555:20171103122608p:plain
k=20
f:id:umashika5555:20171103122624p:plain

なお画像が大きいためサーバーで実行したのだが, OpenCVが入っていなかったのでPILで書きなおした.
この際に画素のRGB値を書き換えた(OpenCVはGBRの順で紛らわしい)のだが, 混乱して正しく書き換えられているか分からない.
もっと保守性高く書きたいものだ(;_;)

【python】 proxy下でデータセットをダウンロードする

以下の設定を書く.

import urllib.request
# proxy の設定
proxy_support = urllib.request.ProxyHandler({'http' : 'http://***.***.***:port',
                                             'https': 'https://***.***.***:port'})
opener = urllib.request.build_opener(proxy_support)
urllib.request.install_opener(opener)

これを事前に書けば

# CIFAR-10データセットをロード
from keras.datasets import cifar10
(X_train, y_train), (X_test, y_test) = cifar10.load_data()
print(X_train.shape, y_train.shape)
print(X_test.shape, y_test.shape)

でエラーを起こさない.

【pandas】 DataFrameから特定の列の取り出し方

f:id:umashika5555:20171031091054p:plain

取り出したい項目["color", "size", price"]を指定して

X = df[["color", "size", "price"]]

のようにして取り出す.

一列の場合なら

df.color

df["color"]

によって"color"の列が取り出せる.

行を取り出すには

#先頭から3行目まで
df[:3]

のようにリストのように扱う.

その他にも条件を指定して抽出したり, 位置を指定して抽出する方法があるらしい.

【参考】
http://pythondatascience.plavox.info/pandas/%E8%A1%8C%E3%83%BB%E5%88%97%E3%81%AE%E6%8A%BD%E5%87%BA

【python】 辞書のキーと値を逆にする操作

辞書型のキーと値の順番を変更した辞書をつくる.
順序特徴量でL, M, Sという文字列の値がある場合, 数値として扱うために
class_mapping = {"L":3, "M":2, "S":1}
のような辞書を定義し, 文字列を数値にする.
これを再び元の形に戻したい場合はinv_class_mapping = {v:k for k,v in class_mapping.items()}
のようにキーと値の順番を入れ替えて同じ操作をすればよい.

class_mapping = {"L":3, "M":2, "S":1}
df["size"] = df["size"].map(class_mapping)
inv_class_mapping = {v:k for k,v in dictionary.items()}
df["size"] = df["size"].map(inv_class_mapping)

【numpy】配列の結合np.hstack(tup)メモ

np.hsatck()では縦方向(axis=1)の結合ができる.
行列a, bに対してaxis=1のみが違うならば, aとbは結合できる.
すなわちa.shape[1]とb.shape[1]のみが異なり, a.shapeとb.shapeの他の要素が同じならば結合可能となる.

その他の結合方法としてcolumn_stack()による横方向の結合, dstak()による深さ方向の結合, vstack(),row_stack()による縦方向の結合などがあるらしい.

またnp.meshgrid()で格子点の制作に使ったnp.c_()も結合の関数である.
この場合はaとbのサイズが同じでなければならない.

> a = np.arange(8).reshape((2,4))
> b = np.arange(100,900,100).reshape(2,4)

> print(a)
[[0 1 2 3]
 [4 5 6 7]]

> print(b)
[[100 200 300 400]
 [500 600 700 800]]

> print(np.r_[a, b])
[[  0   1   2   3]
 [  4   5   6   7]
 [100 200 300 400]
 [500 600 700 800]]

> print(np.c_[a, b])
[[  0   1   2   3 100 200 300 400]
 [  4   5   6   7 500 600 700 800]]

結合があれば分解もあって,np.split()というものがあるらしいが, 今回はまだ勉強しない_(:3」∠)_


【参考】
http://python-remrin.hatenadiary.jp/entry/concatenate
https://deepage.net/features/numpy-stack.html

画風変換アルゴリズムまとめ

今話題の画風変換するDeepLearningで画像Aの画風を画像Bに適応するというアルゴリズムで様々な画風変換を実験したので,その結果をまとめる.


ゴッホの画風(やや失敗)
f:id:umashika5555:20171028031241j:plain
ミュシャの画風(やや失敗)
f:id:umashika5555:20171028031314j:plain
モネの画風(けっこういい感じ)
f:id:umashika5555:20171028031326j:plain
ピカソの画風(かなり失敗)
f:id:umashika5555:20171028031421j:plain

ピカソは「泣く女」という直線が多い画像を使った.
直線が多いと画風を受け継ぐのが難しいのかもしれない.

【Python】help()について

クラス参照するときにhelp()関数を使うとJupyter notebook内で参照できるため便利

import sklearn
import sklearn.linear_model
help(sklearn.linear_model.Perceptron)

下のような説明が出てくる.

Help on class Perceptron in module sklearn.linear_model.perceptron:

class Perceptron(sklearn.linear_model.stochastic_gradient.BaseSGDClassifier, sklearn.feature_selection.from_model._LearntSelectorMixin)
 |  Perceptron
 |  
 |  Read more in the :ref:`User Guide <perceptron>`.
 |  
 |  Parameters
 |  ----------
 |  
 |  penalty : None, 'l2' or 'l1' or 'elasticnet'
 |      The penalty (aka regularization term) to be used. Defaults to None.
 |  
~~~~~~~~~~~~~~~~~~~~~~~~~~~