numpy の数値を表示するときの桁数を指定する

当然ですが、numpyを使っていると数値をprintして値を確認する機会が多々あります。
そこで問題になるのが、表示形式です。
本来は利便性のためだと思うのですが、小数点以下の桁が何桁も表示されたり、突然指数表記になったりします。
正直言って、配列内のどの値が大きくてどの値が小さいのか、ぱっと見でわかりにくいです。

表示例。


>>> import numpy as np
>>> ary = np.random.randn(3, 5)
>>> print(ary)
[[-8.69277072e-01 -4.72662319e-01  5.48868554e-01 -6.03789326e-01 1.95117216e-01]
 [-1.46386861e+00  9.92037075e-01  8.04045031e-01 -1.43756938e+00 7.46898368e-02]
 [-1.05065247e+00  3.72571551e-04 -1.15836779e-01 -5.80949053e-03 1.59979389e+00]]

numpy のドキュメントによると、絶対値が一番大きいものと一番小さいものの差が一定値を超えると指数表記になるそうです。

そこで、値を確認するときは、適当なくらいで四捨五入して表示したりしていたのですが、
実はnumpyのオプションで表示桁数を指定できることがわかりました。

設定を変える前に、デフォルトの設定は下記の関数で見ることができます。
(numpyのバージョンによって設定可能項目は変わります。)


>>> np.get_printoptions()
{'edgeitems': 3, 'threshold': 1000, 'floatmode': 'maxprec', 'precision': 8, 'suppress': False, 'linewidth': 75, 'nanstr': 'nan', 'infstr': 'inf', 'sign': '-', 'formatter': None, 'legacy': False}

各設定値の意味はこちら。set_printoptions
(get_printoptionsのページにはset_printoptions を見ろと書いてある。)

これらの設定値を、set_printoptions関数で変更することができます。
この中で、よく使うのはこの二つ。
precision = 3 # 小数点以下の表記を
suppress = True # 指数表記を禁止

設定してみたのがこちら。


>>> np.set_printoptions(precision=3, suppress=True)
>>> ary = np.random.randn(5,3)
>>> print(ary)
[[ 1.611 -2.259  0.022]
 [-1.937 -0.394  2.011]
 [-0.01  -0.162 -0.823]
 [-1.818 -2.474  0.341]
 [ 0.363 -2.018 -0.667]]

見やすくなりました。

mecab-python3をつかってみる

前回の記事でインストールした mecab-python3 の使い方を書いておきます。
MeCabについてはWikiがあるのですが、このライブラリについては詳細なマニュアルはなく、
リポジトリの test.py を読むようにとそっけなく書いてあります。

ただ、実際のところつかのは非常に簡単です。
次の例のようにMeCab.Tagger() と parse を呼び出すだけで結果を得られます。


>>> import MeCab
>>> text = 'すもももももももものうち'
>>> tagger = MeCab.Tagger()
>>> print(tagger.parse(text))
すもも	名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
うち	名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS

各行の出力結果は次の形です。

表層形\t品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用型,活用形,原形,読み,発音

注意点としては、 parseした戻り値は一つのテキストなので非常に使いにくいことです。

多くの場合、必要なのは原型の列です。
そこでプログラムでこのテキストから原形の情報を取り出すことになります。
僕はいつも下記のような関数を作って実行しています。


tagger = MeCab.Tagger()


def mecab_tokenizer(text):
    parsed_text = tagger.parse(text)
    parsed_lines = parsed_text.split("\n")[:-2]
    surfaces = [l.split('\t')[0] for l in parsed_lines]
    features = [l.split('\t')[1] for l in parsed_lines]
    bases = [f.split(',')[6] for f in features]
    # ここに、必要な品詞の単語だけ選抜する処理を入れることもある
    result = [b if b != '*' else s for s, b in zip(surfaces, bases)]
    return result

Mac(Mojave) に pip で mecab-python3をインストールする時にはまった

環境
MacOS Mojave 10.14.2 (OS)
mecab-python3==0.996.1 (入れようとしたライブラリ)

本当はサクッとインストールして使い方について説明するはずだったのに、非常に苦戦したので記録しておきます。
MeCabをpythonから使うために、mecab-python3をインストールしようとしました。
コマンドはサイトに書いてある通り、こちらです。


pip install mecab-python3

これ、自分のや職場のPC,クラウド環境など、過去にいろんな環境で実行してきましたが、今回初めて失敗しました。

まず最初のエラーは、swig が入ってないとのことだったので、Homebrewで入れます。


brew install swig

この後再実行すると、別のエラー。しかもかなりの長文が出て失敗しました。
問題の箇所を抜粋したのがこちらです。


  warning: include path for stdlibc++ headers not found; pass '-std=libc++' on the command line to use the libc++ standard library instead [-Wstdlibcxx-not-found]
  MeCab_wrap.cpp:3051:10: fatal error: 'stdexcept' file not found
  #include 
           ^~~~~~~~~~~
  1 warning and 1 error generated.
  error: command 'gcc' failed with exit status 1

なにかのheaderがないと言われています。
これについて調べた結果、ネット上各所に command Line Toolsの
最新バージョンが問題であると指摘がありました。
ということで、command Line Toolsのバージョンを落とします。
こちらにアクセス
https://developer.apple.com/download/more/

どこまで古いバージョンなら良いのか確信が持てませんでしたが、
試しにXcode 9.4 向けのdmgファイルをダウンロードしてインストールしました。
その後、改めて最初のpipコマンドを打つと無事にpythonからMeCabが使えるようになりました。

jupyter notebook 上で pycodestyle を使う

テキストエディタで.py ファイルを使う時はコードを綺麗にするために、
pycodestyle (pep8の新しい名前)をよく使います。名前変更の経緯はこちら

これを jupyter notebook でも使えるようにします。
その際に必要になるのが、こちらの pycodestyle_magic というツールです。
flake8というライブラリも必要になるので、一緒に入れます。
(pycodestyleがない場合はそれも必要なのでpipインストールしてください。)

pip install flake8 pycodestyle_magic

使う時は、notebookで事前に読み込み、フォマットをチェックしたいセルで、マジックコマンドを使います。


# magicコマンドを使えるように読み込む
%load_ext pycodestyle_magic

そして、チェックしたいコードが書かれたセルの一番上の行にマジックコマンドを入れて実行します。


%%pycodestyle
#ここにチェックしたいプログラムが書かれている。

問題があれば下記のように警告が表示されます。# の後ろにスペースがありませんでしたね。


2:1: E265 block comment should start with '# '

注意として、この時プログラム自体は実行されないようです。
そのため、スタイルをチェックし終わったら、
マジックコマンドを外して改めてセルを実行する必要があります。

jupyter notebookをバックグラウンドで起動する

普段のPythonプログラミングには、jupyter notebook を使用しています。
AWSのサーバーに立てたnotebookを使っている時は良いのですが、
ローカルのMacで動かしている時は
ターミナルを立ち上げっぱなしにしておかないといけないので少し不便です。

そこで、jupyterをバックグラウンドで動かすようにします。
利用するのは nohupコマンドです。
頻繁に使用するので、下記のような内容でスクリプト化しておくと便利です。


#!/usr/bin/env bash
nohup jupyter notebook >> jupyter.log 2>&1 &

これを実行すると、notebookが立ち上がり、しかも端末を切っても動き続けます。

Simple Mathjax を導入

現状、ブログ構築やMacの環境構築関係の記事ばかりですが、近々データサイエンス関係の記事を増やしたいので、
このブログに数式を入れられるようにしておく必要があります。
ということで、Simple Mathjax というプラグインを追加しました。
これで記事中でTeXによる数式が書けるはずです。

インラインの場合は\$マークで囲めば良いそうです。たとえば、三角関数の公式であれば、$\tan\theta=\frac{\sin\theta}{\cos\theta}$と表示できます。

\$\$で囲むことによってブロック表示になります。
活性化関数としてよく使われる、ReLUを書いてみましょう。

$ReLU(x) = \max(0,x) =\left\{\begin{array}{ll} 0 & (x<0) \\ x & (x\geq0) \end{array}\right.$

pyenvにより発生するようになったHomebrewのWarningに対応する

以前対処した時のメモがあるので記事化しておきます。

Macにpyenvをインストールすると、brew doctorでwarningが出るようになります。

yutaro の部分はそれぞれの環境のユーザー名で読み替えてください。


$ brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry or file an issue; just ignore this. Thanks!

Warning: "config" scripts exist outside your system or Homebrew directories.
`./configure` scripts often look for *-config scripts to determine if
software packages are installed, and what additional flags to use when
compiling and linking.

Having additional scripts in your path can confuse software installed via
Homebrew if the config script overrides a system or Homebrew provided
script of the same name. We found the following "config" scripts:
  /Users/yutaro/.pyenv/shims/icu-config
  /Users/yutaro/.pyenv/shims/libpng16-config
  /Users/yutaro/.pyenv/shims/python3.7-config
  /Users/yutaro/.pyenv/shims/python3.7m-config
  /Users/yutaro/.pyenv/shims/python-config
  /Users/yutaro/.pyenv/shims/python3-config
  /Users/yutaro/.pyenv/shims/ncursesw6-config
  /Users/yutaro/.pyenv/shims/pcre-config

要するに、 PATH の中に、 Homebrewが知らない -config ファイルがあると文句を言っています。
環境変数のPATHを確認すると、.pyenv/shims: が追加されているのでこれが問題です。


$ echo $PATH
/Users/yutaro/.pyenv/shims:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

対応としては、brewコマンドを実行する時だけ、PATHから、 .pyenvディレクトリを外します。
.bash_profileを開いて、下記のエイリアスを追加します。


alias brew="env PATH=${PATH/\/Users\/yutaro\/\.pyenv\/shims:/} brew"

ターミナルを再起動して、結果が反映されていることを確認します。


$ brew doctor
Your system is ready to brew.

Macにpyenvとanacondaをインストールする

Mac book Pro のOSをMojave にアップデートして以来、Homebrew関係の環境がおかしくなってしまっているので、最近環境を作り直しています。
その一環でpyenvも入れ直したので記事にしておきます。

まず前提として、pythonには2系と3系があり、macに標準で入っているのは 2系です。


$ python --version
Python 2.7.10

これはOSも使っているそうで、直接このpythonのバージョンをあげるのは良くないこととされているので、
pyenvというツールを使って、独立した環境に3系のpythonを入れます。
また、機械学習等に使うのが目的なので、便利なライブラリが同梱されたディストリビューションである、
Anacondaを使います。

pyenvの導入手順は リポジトリのReadmeの該当箇所を参考に、以下のコマンドを順に実行します。


$ brew update
$ brew install pyenv
$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bash_profile
$ exec "$SHELL"

.bash_profile への initの追記についてですが、
shell configuration fileの最後に書けと書いてありますので、
今後.bash_profile ファイルを編集するときにこの後ろに何か書いてしまわないように、注意書きか何かコメントしておきましょう。

Please make sure eval “$(pyenv init -)” is placed toward the end of the shell configuration file since it manipulates PATH during the initialization.z

pyenvが入ったら、Anacondaの導入です。 下記コマンドで、インストール可能なバージョンが一覧表示できます。


$pyenv install -l
-- 略 --
  anaconda3-5.1.0
  anaconda3-5.2.0
  anaconda3-5.3.0
  anaconda3-5.3.1

今回は anaconda3-5.3.1 を導入します。


$ pyenv install anaconda3-5.3.1

さらに、導入したバージョンを利用するように設定して、確認します。


$ pyenv global anaconda3-5.3.1
~$ python --version
Python 3.7.0

昔の Anacondaは version表示するとその名前が出てきた覚えがあるのですが仕様が変わったのかもしれませんね。

MacにMeCabをインストールする

Mac Book Proに 形態素解析ソフトのMeCabをインストールします。

homebrewを導入済みであれば簡単です。
ソフトウェア本体と、IPA辞書を順番にインストールします。


brew install mecab
brew install mecab-ipadic

入ったらテストしましょう。mecabコマンドで起動したあと、形態素解析したい文章を入力します。


~$ mecab
すももももももものうち
すもも	名詞,一般,*,*,*,*,すもも,スモモ,スモモ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
うち	名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS

終了は Ctrl + d です。

WordPressの一般設定にあるURLをhttpsに変える

証明書の自動更新まで設定し終わった段階で、https化の作業は終わったと思っていたのですが、
まだ残っているのがありました。

WordPressにログインし、一般設定を見ると、
WordPress アドレス (URL) と サイトアドレス (URL) という設定を見ると、
どちらも https://analytics-note.xyz と、httpのURLが設定されてしまっていて
しかも網がかかっていて修正ができません。

記事中でブログ内でリンクを貼る時など、いろんな場面で利用する設定のようで、
このままでは不都合ありそうです。

WordPressの日本語ドキュメントの一般設定から引用します。

WordPress のアドレス(URL)
WordPressのコア・アプリケーションのファイル(たとえばwp-config.php, wp-admin, wp-content, wp-includesなど)を含むディレクトリの正式なURLを入力します。たとえば、あなたが「blog」という名前のディレクトリにWordPressをインストールした場合は、WordPressのアドレスはhttp://example.net/blogとなります(example.netは利用者のドメイン名です)。もしも、WebサイトのルートにWordPressをインストールした場合は、このアドレスはhttp://example.netとなります。URLの最後にスラッシュ(/)を付けた場合は自動的に省かれます。wp-config.php ファイル内で WP_SITEURL 定数を定義すると、定義した値がこのフィールドに入り、管理画面から編集することはできません。

サイトアドレス(URL)
WordPressサイトを呼び出す時に、ブラウザに閲覧者が入力するURLを入力します。このURLは、WordPressのindex.phpがインストールされているディレクトリです。 WordPress を専用ディレクトリに配置する場合以外は、ブログのアドレス(URL)と前述のWordPressのアドレス(URL)が同一です。URLの最後にスラッシュ(/)を付けた場合は自動的に省かれます。wp-config.php ファイル内で WP_HOME 定数を定義すると、定義した値がこのフィールドに入り、管理画面から編集することはできません。

要するに、 wp-config.php で設定されていると管理画面から変更ができないそうなので、
wp-config.php から編集します。

参考:サイト URL の変更

編集するファイルは
/opt/bitnami/apps/wordpress/htdocs/wp-config.php
です。
中に確かに次のような記載がありました。


define('WP_SITEURL', 'http://' . $_SERVER['HTTP_HOST'] . '/');
define('WP_HOME', 'http://' . $_SERVER['HTTP_HOST'] . '/');

これを下記のようにhttpsに書き換えます。


define('WP_SITEURL', 'https://' . $_SERVER['HTTP_HOST'] . '/');
define('WP_HOME', 'https://' . $_SERVER['HTTP_HOST'] . '/');

保存したら自動的に反映されたようです。