pyenv+minicondaを使った環境構築

install_python.sh

#!/bin/bash
set -eu
export PYENV_ROOT=$HOME/.pyenv
export PATH=$PATH:$PYENV_ROOT/bin

case $OSTYPE in
  darwin*)
    if [ ! -e $PYENV_ROOT ]; then
      if ! type brew; then
        echo "please install homebrew (https://brew.sh/)" >&2
        exit 1
      fi
      brew install pyenv
      ln -sf /usr/local/opt/pyenv $PYENV_ROOT
    fi
    ;;

  linux*)
    if [ ! -e $PYENV_ROOT ]; then
      if ! type curl; then
        echo "please install 'curl'" >&2
        exit 1
      fi
      (cd && curl https://pyenv.run| bash)
    fi
    ;;
esac
eval "$(pyenv init -)"

conda3='miniconda3-latest'
if [ ! -d $PYENV_ROOT/versions/$conda3 ]; then
  pyenv install $conda3
fi
pyenv global $conda3

cat <<'EOT'
please define the environment
(see: https://github.com/pyenv/pyenv)
-------------------------------------
export PYENV_ROOT=$HOME/.pyenv
export PATH=$PATH:$PYENV_ROOT/bin
eval "$(pyenv init -)"
-------------------------------------
EOT

テンプレート集

練習のため競技プログラミングをやっていたときや、その他ちょっとハマったものまとめ。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
path操作
"""
import os
# homeディレクトリのpath
home_dir = os.path.expanduser("~")

# dpath内のファイル名一覧を取得
fname_list = os.listdir(dpath)

import glob
# dpath内にあるファイルのパス一覧を取得
file_list = glob.glob(os.path.join(dpath, "*"))

"""
ファイル入力
"""
# 改行区切りのファイルを読み込む
data = []
with open("text_file", "r") as lines:
    for line in lines:
        data.append(line.rstrip("\n"))

"""
標準入力
"""
# 1文字受け取りint型に変換
x = int(input())
# 空白区切りの文字を受け取る
lines = input().split()
# 空白区切りの文字を受け取り整数に変換
n1, n2 = map(int, input().split())
# 空白区切りの文字を受け取りint型に変換したリスト
lines = list(map(int, input().split()))
# n行の数字を受け取る
n = int(input())
a = [int(input()) for i in range(n)]

"""
編集
"""
# str型に変換して結合
s = ''.join(list(map(str, a)))
# 置換
input().replace('before', 'after')
# 正の数の四捨五入 (0.5を足してintを取る)
int(x + 0.5)
# 正の数の小数切り上げ (マイナス無限大への丸め込み)
-(-x // 1)
# 五捨五入(python3から0.5ぴったりの場合は偶数(0と1で0)の方に丸められる。)
round(x)

# 符号を返す
def bit(x):
    # return 1 - (x <= 0) - (x < 0)
    return (x > 0) - (x < 0)

# python2ではビルトイン関数があった
# cmp(x,y)は、x>yだと1、x=yだと0、x<yだと-1を返す
# cmp(x, 0)

# 関数かどうか
from inspect import isfunction
isinstance(bit, isfunction)

# 実数かどうか
import numbers
isinstance(x, numbers.Real)

# 0埋め
s = "{:04d}".format(n)
s = str(n).zfill(4)

# 空白埋め
width = 20
s.ljust(width)
s.rjust(width)
s.center(width)

"""
正規表現
"""
import re
# 最長マッチ
result = re.search(r".*/", "a/b/c").group(0)
#>>> a/b/
# 最短マッチ
result = re.search(r".*?/","a/b/c").group(0)
#>>> a/

"""
多次元配列
"""
width = 2
height = 2
# 初期化
data = [[0 for j in range(width)] for i in range(height)]
"""
注意
data = [[0]*width]*height ではダメ
(参考 http://qiita.com/utgwkk/items/5ad2527f19150ae33322#fnref3)
"""

"""
numpy
"""
import numpy as np
# 文字列(1文字)を取り扱う
s = np.zeros(n, dtype=str)
"""
注意
これだと s.dtype = dtype(';<U1') となり1文字までしか格納できない
"""
# 文字列(上限32文字)を取り扱う
s = np.zeros(n, dtype=';<U32')

# order sort
dtype = [("g", int), ("s", int), ("b", int)]
medal = [0] * N
for i in range(N):
    g, s, b = map(int, input().split())
    medal[i] = (g, s, b)
medal = np.array(medal, dtype=dtype)
medal = np.sort(medal, order=["g", "s", "b"])

# N x N行列
import numpy as np
zero = np.zeros([n, n], dtype=np.int)
'''
  -----------------→  y
| [[0, 0, 0, 0, 0, 0],
|  [0, 0, 0, 0, 0, 0],
|  [0, 0, 0, 0, 0, 0],
|  [0, 0, 0, 0, 0, 0],
|  [0, 0, 0, 0, 0, 0],
↓ [0, 0, 0, 0, 0, 0]]
x
'''
# 配列の結合
a = np.arange(0, 5)
b = np.arange(6, 11)
new = np.concatenate([a, b])

# 行列式
A = np.array([[1, 2], [3, 4]])
determinant = np.linalg.det(A)

# ラジアンに変更
theta = 180
np.radians(theta)
# 角度に変更
radian = np.pi
np.degrees(radian)

"""
標準出力
"""
# 空白区切りで出力
print("x", "y")
# '/'区切りで出力
print('/'.join(["A", "B", "C"]))
# カンマ区切りで出力
print(",".join(["A", "B", "C"]))

"""
ファイルに出力
"""
with open("txt_file", "w") as obj:
    print("x", file=obj)
    obj.write("y\n")

"""
set (重複なし集合)
.add
.remove
.discard
"""
A = set([1, 2, 3, 4])
B = set([3, 4, 5, 6])
# A ∪  B (和集合)
C = A | B
# A ∩  B (積集合)
C = A & B
# 部分集合かどうか
C.issubset(A)

"""
bashコマンドを実行
"""
# 1. 実行するだけ
import subprocess
cmd = "mkdir temp"
subprocess.call(cmd, shell=True)

# 1. 実行結果を受け取る
resutls = str(subprocess.check_output(["ls", "temp"]))

Use Type 1 Font

論文投稿時に"Type 3 Font error"に遭遇。その対処方法。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt

# Type 1 PostScript fonts
plt.rcParams['ps.useafm'] = True
plt.rcParams['pdf.use14corefonts'] = True

# tex typesetting
plt.rcParams['text.usetex'] = True
plt.rcParams['text.latex.preamble'] = [r'\usepackage{sansmath}', r'\sansmath']  # Force sans-serif math mode for axes labels

# plt.rcParams['font.family'] = 'sans-serif'  # regular text
# plt.rcParams['font.sans-serif'] = 'Helvetica'  # choose a font here

plt.rcParams['font.family'] = 'serif'  # regular text
plt.rcParams['font.sans-serif'] = 'Times New Roman'  # choose a font here

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)

ax.set_title("title")

ax.set_xscale("log")
ax.set_xlim(1e+1, 1e+2)
ax.set_xlabel(r"$\log_{10}{x}$")

ax.set_ylim(0, 10)
ax.set_ylabel(r"$-y$")

fig.savefig("type1_postscript.pdf")

備忘録(Japanese)

Menu

to top