Mar 05, 2017

pandas.read_csv+numpy.bincountでエラー

ちょっと前に、はやりのAIのプログラミングでよく使われるPythonとNumPyとPandasを使い始めたのだが、PandasでCSVファイルを読み込んで、各ラベルの出現回数を得る為にNumPyのbincountメソッドを使うと、次のようなエラーが出て、困った。

TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe'
その時使った環境は、Windows 7(32bit版)+Python 3.5.2(Anaconda 4.1.1 (32-bit))である。Mac OS Xでは出なかった。

これは、32bitのPythonを使っていると起こることらしい。例えば、32bit Pythonで次のプログラムを実行すると、同じエラーが出る。

import numpy as np
import pandas as pd
import io

data = np.random.randint(10, size=30)
buf = io.StringIO("\n".join(str(x) for x in data))
df = pd.read_csv(buf, header=None)
x = df[0].values
print(x)
print(np.bincount(x))	#Error on 32bit Python
これは、Pandasが32bit Pythonでもint64を使うのが原因のようである。

このエラーを回避するには、bincountに渡すデータの型をint32にすれば良い。

print(np.bincount(x.astype('int32')))	#also OK on 32bit Python
出力例
[1 0 6 7 1 7 7 6 9 5 6 2 8 0 7 6 7 8 9 7 8 9 8 0 2 1 2 6 0 3]
[4 3 3 1 0 1 5 6 4 3]

または、np.unique(return_counts=True)を使う方法があり、こちらの方が、大抵の場合はnp.bincountを使うよりも好ましいとされるようである。

print(np.unique(x, return_counts=True))
出力例
(array([0, 1, 2, 3, 5, 6, 7, 8, 9]), array([4, 3, 3, 1, 1, 5, 6, 4, 3]))
確かに、np.unique(return_counts=True)の方が、データに負の値があっても使えるし、大きな値が混ざってても配列が巨大にならないので、安全そうである。

なお、今動作しているPythonが32bitか64bitかを判定する方法は、いくつかあるようである。 例1

import platform
platform.architecture()
出力(上がMacOSX、下がWin32)
('64bit', '')
('32bit', 'WindowsPE')
例2
import sys
"%x" % sys.maxsize
出力(上がMacOSX、下がWin32)
'7fffffffffffffff'
'7fffffff'
例3(platform.architecture()の実装にも使われている方法)
import struct
struct.calcsize("P") * 8
出力(上がMacOSX、下がWin32)
64
32


上記の通り、Pandasには32bit Pythonでもint64を使う問題があるし、32bit Windowsだと1つのプロセスで2G以上のメモリ確保ができないし、VMWare等で64bit OSを動作させても(CPUが適切な仮想化テクノロジーをサポートしていれば可能)そもそも32bit WindowsだとRAMが3GBちょっとしか使えないので、32bit WindowsでPython+NumPy+Pandasを使うのは色々困難を伴いそうである。

かなり出遅れたが、プログラミングの勘を取り戻す為の練習を兼ねて、今はやりのAIをかじりかけている。
というか、筆者は20年ちょっと前に卒業した大学の卒論の研究テーマがなぜかAI関連で、そのテーマで指導教官が書いた論文が人工知能学会誌に載っており、過去にAIを学んだことになっているのだが、専攻が制御工学だったのでAI関係の講義を受けなかったし、勉強嫌いでAI関係の論文を1つも読まなかったので、AIのことを何も知らず、そのことがずっと心に引っかかっているのである。卒論の題名に「強化学習」と入っていたが、未だに「強化学習」の定義がよくわからない。よく卒業できたものだ。
この機会に、自信を持って「人工知能の研究をしてた」と言えるよう、少し勉強しようと思う。

Posted at 20:47 in PC一般 | WriteBacks (0)
WriteBacks

writeback message: