ちょっと前に、はやりの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で次のプログラムを実行すると、同じエラーが出る。
これは、Pandasが32bit Pythonでもint64を使うのが原因のようである。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
このエラーを回避するには、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
出力(上がMacOSX、下がWin32)import platform platform.architecture()
('64bit', '')例2
('32bit', 'WindowsPE')
出力(上がMacOSX、下がWin32)import sys "%x" % sys.maxsize
'7fffffffffffffff'例3(platform.architecture()の実装にも使われている方法)
'7fffffff'
出力(上がMacOSX、下がWin32)import struct struct.calcsize("P") * 8
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のことを何も知らず、そのことがずっと心に引っかかっているのである。卒論の題名に「強化学習」と入っていたが、未だに「強化学習」の定義がよくわからない。よく卒業できたものだ。
この機会に、自信を持って「人工知能の研究をしてた」と言えるよう、少し勉強しようと思う。
コメント