もともと、文字列と数値が入った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) 10221023 # 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) 10221023 # 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) 726727 typ = dtype.typeValueError: 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における要素のデータ型dtypeの種類と指定方法 - DeepAge
つまり、正しくNumPy配列のデータ型を指定することでPythonからでもメモリ効率と実行効率の良いコードを実装することができます。
https://deepage.net/features/numpy-dtype.html
で、これは仮説だけど、numpyはデータを取得するときに、デフォルトでfloatで取得してしまうらしい。string型もfloatで取得してしまい、エラーが起こってしまっているのだと思われる。なので、
dtype = Non
を指定してあげることで、解決できた。