何かしらの処理の結果得られたnumpy配列を標準出力に流したい、という時の方法。
Python2系と3系で微妙に違ったので両方書きます。
Python2系
numpy配列をファイルに保存する関数としてnumpy.savetxt()
がありますが、
引数の保存先にsys.stdout
を指定することでnumpy配列を標準出力に流すことができます。
- サンプルコード
import sys
import numpy as np
X = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
np.savetxt(sys.stdout, X)
- 実行
$ python save_stdout_2.py
1.000000000000000000e+00 2.000000000000000000e+00 3.000000000000000000e+00
4.000000000000000000e+00 5.000000000000000000e+00 6.000000000000000000e+00
Python3系
基本的には2系と同じなのですが、そのままsave_stdout_2.py
を実行すると次のようなエラーが出ます。
$ python save_stdout_2.py
...
TypeError: Mismatch between array dtype ('float64') and format specifier ('%.18e %.18e %.18e')
以下によると、どうやらPython3系においてnumpy.savetxt()
はバイナリモードで書き込むことを前提としているらしいです。
https://stackoverflow.com/questions/35372829/numpy-savetxt-resulting-a-formatting-mismatch-error-in-python-3-5
savetxt opens the file in wb mode, and thus writes everything as bytes.
そこで出力先をsys.stdout.buffer
に変更します。これはバイナリデータの読み書きを行うオブジェクトです。
- サンプルコード
import sys
import numpy as np
X = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
np.savetxt(sys.stdout.buffer, X)
- 実行
$ python save_stdout_3.py
1.000000000000000000e+00 2.000000000000000000e+00 3.000000000000000000e+00
4.000000000000000000e+00 5.000000000000000000e+00 6.000000000000000000e+00
Python2系と同じ出力を得ることができました。
おまけ-標準入力
np.loadtxt()
の読み込み先をsys.stdin
にすることで標準入力の文字列をnumpy配列に入れることができます。
- サンプルコード
import sys
import numpy as np
X = np.loadtxt(sys.stdin)
これを使えばシェルのフィルタコマンドでは困難な処理もPythonで書くことができます。