2017-11-23

numpyで文字列と数値が入ったcsvを読み込む際の詰まりどころと解決方法

numpyで文字列と数値が入ったCSVを読み込みたかったが苦戦したのでメモ。

もともと、文字列と数値が入ったoutput.csvに対して、以下の方法で読み取ろうとしていた。

np.py

from pylab import * 
import numpy as np

%matplotlib inline #Jupiter Notebookでグラフ表示させるおまじない

data = np.loadtxt('output.csv', delimiter=',')

そうするとこういうエラーが吐かれた

---------------------------------------------------------------------------ValueError                                Traceback (most recent call last)
<ipython-input-39-5d33cf5a6e2a> in <module>()----> 1 data = np.loadtxt('output.csv', delimiter=',')
/usr/local/lib/python3.5/dist-packages/numpy/lib/npyio.py in loadtxt(fname, dtype, comments, delimiter, converters, skiprows, usecols, unpack, ndmin)   1022
   1023             # Convert each value according to its column and store-> 1024             items = [conv(val) for (conv, val) in zip(converters, vals)]   1025             # Then pack it according to the dtype's nesting   1026             items = pack_items(items, packing)
/usr/local/lib/python3.5/dist-packages/numpy/lib/npyio.py in <listcomp>(.0)   1022
   1023             # Convert each value according to its column and store-> 1024             items = [conv(val) for (conv, val) in zip(converters, vals)]   1025             # Then pack it according to the dtype's nesting   1026             items = pack_items(items, packing)
/usr/local/lib/python3.5/dist-packages/numpy/lib/npyio.py in floatconv(x)    723         if b'0x' in x:    724             return float.fromhex(asstr(x))--> 725         return float(x)    726
    727     typ = dtype.type
ValueError: could not convert string to float:

ValueError: could not convert string to float:


このエラーはどういうことだろうといろいろ調べてみて、こうしたらうまく読み込めた

np.py

data = np.genfromtxt("output.csv", dtype = None, delimiter = ",") #これで文字列を取得できる

原因


dtypeが問題らしい。dtypeについて調べてみたところ、メモリ効率化のためにデータを指定して読みだすらしい。

NumPyは基本的には、大量のデータ操作を高速に実行できるように内部ではCで実装されています。Python自体はそれほど高速な言語ではないため、行列演算の操作やデータの扱いはCから行われます。
つまり、正しくNumPy配列のデータ型を指定することでPythonからでもメモリ効率と実行効率の良いコードを実装することができます。
NumPyにおける要素のデータ型dtypeの種類と指定方法 - DeepAge
https://deepage.net/features/numpy-dtype.html


で、これは仮説だけど、numpyはデータを取得するときに、デフォルトでfloatで取得してしまうらしい。string型もfloatで取得してしまい、エラーが起こってしまっているのだと思われる。なので、

 dtype = Non

を指定してあげることで、解決できた。

注目の投稿

 PythonのTweepyを利用して、Twitter APIを利用している。 その中で、ハマったポイントをメモしておく。 まず、Searchに関して。 Twitter検索は、クライアントアプリ側では、全期間の検索が可能になっている。 一方で、APIを利用する際は、過去1週間しか...