【pandas】 Seriesの生成

s1 = Series([3, 81, -4, 0])
s1
'''
結果
0     3
1    81
2    -4
3     0
dtype: int64
'''
# コンソールでの出力時にはタイプも表示される
 
s2 = Series(['x', 'yy', 'zzz'])
s2
'''
0      x
1     yy
2    zzz
dtype: object
'''
# 文字列はobject型に。
 
s3 = Series([-7, 12, 1], index=['p', 'a', 'n'])
s3
'''
p    -7
a    12
n     1
dtype: int64
'''
# インデックスに名付け
 
s3.index
'''
Index([u'p', u'a', u'n'], dtype='object')
'''
# インデックスオブジェクトの取得
 
s3.values
'''
array([-7, 12,  1])
'''
# 値の取得
 
s4 = Series([12.2, 4, 8, 9])
s4
'''
0    12.2
1     4.0
2     8.0
3     9.0
'''
dtype: float64
# 小数点以下があるとfloat64型に。
 
s5 = Series([1.0, 9, 8, 4])
s5
'''
0    1
1    9
2    8
3    4
dtype: float64
'''
# 小数点以下が0のときも、表示は整数だけどfloat64型になっている
 
s6 = Series({'Guido': 2400, 'Wes': 1080, 'Travis': 3200})
s6
'''
Guido     2400
Travis    3200
Wes       1080
dtype: int64
'''
# ディクショナリからSeriesを生成することもできる
# インデックスはソートされる

Linux(CentOS)にPython 2.7.11をインストール

公式のPython Source ReleasesでPythonの各バージョンのページへ飛べます。Latest Python 2 Releaseとして示されている最新版のページ(記事執筆時では 2.7.11)へ移動。

Windows用、Mac用といろいろ並んでますが、Linuxなら
・XZ compressed source tar ball (2.7.11) (sig)
・Gzipped source tar ball (2.7.11) (sig)
のいずれかですね。

ダウンロードは、そのままブラウザからでも、コマンドラインからwgetを使うのでもいいと思います。

sudo wget https://www.python.org/ftp/python/2.7.11/Python-2.7.11.tgz
$ tar xvzf Python-2.7.11.tgz
$ cd Python-2.7.11
$ ./configure --with-threads --enable-shared --prefix=/usr/local
$ make
$ sudo make install

バージョンを確認。

$ python --version
Python 2.7.11

OKです。

途中でerror while loading shared libraries:…というエラーが出る場合、ライブラリへのパスが通っていないのでLD_LIBRARY_PATH にパスを追加します。

$ export LD_LIBRARY_PATH="/usr/local/lib"

いくつかのサイトでは、Pythonのインストールの前に必要なパッケージとしていくつかのパッケージをインストールする手順が紹介されています。こんな感じです。

$ sudo yum install zlib zlib-devel tk-devel tcl-devel sqlite-devel ncurses-devel gdbm-devel readline-devel bzip2-devel db4-devel openssl-devel

この手順は必ずしも必要ではないと思います。
いきなりPythonのダウンロード、インストールをしましたが大丈夫だったので。
内容からいっても、必ずしも必要なパッケージばかりというわけではないはずです。
でもよくわからなければ、とりあえず全部入れとくというのもアリだと思います。

zlib ファイルの圧縮・伸長のためのパッケージ
zlib-devel zlibの開発用パッケージ
tk-devel GUIアプリケーション作成のためのパッケージ
tcl-devel スクリプト言語Tcl(ティクル)を扱うためのパッケージ
sqlite-devel RDB管理システムSQLiteを扱うためのパッケージ
ncurses-devel TUI(Text User Interface)作成のためのライブラリncursesを扱うためのパッケージ
gdbm-devel GNUプロジェクトによるDatabase ManagerであるGDBMを扱うためのパッケージ
readline-devel コマンドラインで対話的にやり取りするためのパッケージ
bzip2-devel ファイルの圧縮・伸長のためのパッケージ
db4-devel Berkeley DBを扱うためのパッケージ
openssl-devel OpenSSL関係のパッケージ

【NumPy】np.frombuffer() – 既存のデータを高速に読み込みndarrayを生成する

NumPyのnumpy.frombuffer(以下np.frombuffer)についてのメモです。

Pythonのいくつかのオブジェクトはbufferというプロトコルを用意しています。bufferは、そのオブジェクトの生のバイト列へのアクセスを可能にしています。直接メモリにアクセスできるため、大規模なデータをコピーせず処理したい場合などに有効です。

np.frombuffer()は、buffer(をサポートしているオブジェクト)を引数にとり、1次元の配列(ndarray)を作るメソッドです。

引数がbufferと言われても馴染みがないかもしれませんが、string型や、read()で読み込んだファイルなどもnp.frombufferの引数になり得ます。

numpy.frombuffer(buffer, dtype=float, count=-1, offset=0)

buffer : bufferへのアクセスをサポートしているオブジェクト。
読み込むオブジェクト。
dtype(オプション) : data type型
返り値となる配列のデータタイプ。デフォルトはfloat型。
count(オプション) : int型
読み込むバイト数。デフォルトは-1で、すべてのデータを読み込むことを示す。
offset(オプション) : int型
オフセット=先頭から何バイトスキップするか。デフォルトは0。

例:

import numpy as np
s = 'hello world'
np.frombuffer(s, dtype='S1', count=5, offset=6)
'''
array(['w', 'o', 'r', 'l', 'd'],
dtype='|S1')
'''




np.frombuffer()はどれだけ速いか

ndarrayを生成するNumPyのメソッドはいくつかありますがnp.array()np.fromiter()np.frombuffer()の処理速度の比較を行ってみました。8バイトfloat型の0を1億回繰り返したPythonの配列(array)からndarrayを生成します。

import numpy as np
import array
from datetime import datetime
test = array.array('d', [0]*100000000)

t = datetime.now()
np.array(test)
print datetime.now() - t

t = datetime.now()
np.fromiter(test, dtype=np.int)
print datetime.now() - t

t = datetime.now()
np.frombuffer(test)
print datetime.now() - t

np.array(): 58.441448 秒
np.fromiter(): 10.787999 秒
np.frombuffer(): 0.003243 秒

np.fromiter()に比べ、np.frombuffer()の方が3326倍速いです。

参考:efficient python array to numpy array conversion (Stack Overflow)

np.fromstring()とnp.frombuffer()の速度比較

次は文字列から配列を作る処理についてnp.fromstring()np.frombuffer()を比較します。’python’を1億回繰り返した文字列から配列を作ります。

s = 'python' * 100000000

t = datetime.now()
np.fromstring(s)
print datetime.now() - t

t = datetime.now()
np.frombuffer(s)
print datetime.now() - t

結果:
np.fromstring(): 0.449931 秒
np.frombuffer(): 0.000220 秒

np.fromstring()に比べ、np.frombuffer()の方が2045倍速いです。

参考:NumPy – What is the difference between frombuffer and fromstring?(Stack Overflow)

バイトオーダの指定

以下はnp.frombuffer()よりdtypeの説明になってしまいますが、バイトオーダの指定について説明します。

マシンのバイトオーダとデータのそれが異なる場合、バイトオーダを明記しなければいけません。バイトオーダは、data typeの属性として指定します。

dt = np.dtype(int)
dt = dt.newbyteorder('>')
np.frombuffer(buf, dtype=dt)

1~2行目の部分は、次のように短く書くこともできます。

dt = np.dtype('>i8')

バイトオーダがビッグエンディアンであれば‘>’(大なり)、リトルエンディアンであれば‘<'(小なり)を指定します。マシンと同じバイトオーダで読み込むならば‘=’(イコール)を指定します。実行結果の表示にdtype=’|S8’のように、‘|’(バーティカルバー)を含んだ表示がでることがありますが、これも’=’と同じくマシンと同じバイトオーダであることを示します。

返り値の配列のデータはバイトスワップ(バイト列の順序の並び替え)されませんが、処理の際は、正しく解釈されるようです。

参考:
SciPy.org – numpy.frombuffer
Bufferプロトコル(Python3.5.1ドキュメント)
bufferオブジェクトとmemoryviewオブジェクト(Python2.7 ドキュメント)

【matplotlib】import matplotlibでfont cacheについてUserWarningが出る場合

python2.7.10(pyenv)環境下でのJupyter notebookでimport matplotlibしたときにWarningが出た。

Enthought Knowledge Base:Matplotlib 1.5.1: Font Cache Warningの情報でドンピシャに解決したのでシェアします。以下は参考にしたこの記事の大まかな訳です。

続きを読む “【matplotlib】import matplotlibでfont cacheについてUserWarningが出る場合”