pandasモジュールのCSV(またはtxtファイル)の読み取りに問題があります。numpyのloadtxt関数には時間がかかりすぎるため、代わりにpandas read_csvを使用することにしました。
スペースで区切られた4つの列を持つtxtファイルからnumpy配列を作成し、非常に多数の行(256 ^ 3など。この例では64 ^ 3)を作成します。
問題は、理由がわからないことですが、pandasのread_csvは常にcsv(txt)ファイルの最初の行(最初の行)をスキップするため、データが1つ少なくなります。
ここにコードがあります。
from __future__ import division
import numpy as np
import pandas as pd
ngridx = 4
ngridy = 4
ngridz = 4
size = ngridx*ngridy*ngridz
f = np.zeros((size,4))
a = np.arange(size)
f[:, 0] = np.floor_divide(a, ngridy*ngridz)
f[:, 1] = np.fmod(np.floor_divide(a, ngridz), ngridy)
f[:, 2] = np.fmod(a, ngridz)
f[:, 3] = np.random.Rand(size)
print f[0]
np.savetxt('Testarray.txt',f,fmt='%6.16f')
g = pd.read_csv('Testarray.txt',delimiter=' ').values
print g[0]
print len(g[:,3])
出力に表示されるf [0]とg [0]は一致する必要がありますが、一致しないため、pandasはTestarray.txt
の最初の行をスキップします。また、読み込まれたファイルの長さg
は、配列f
の長さよりも短くなります。
私は助けが必要です。
前もって感謝します。
デフォルトでは、pd.read_csv
はheader=0
を使用します(names
パラメーターも指定されていない場合)。つまり、最初(つまり0番目のインデックス)の行は列名として解釈されます。
データにヘッダーがない場合は、使用します
pd.read_csv(..., header=None)
例えば、
import io
import sys
import pandas as pd
if sys.version_info.major == 3:
# Python3
StringIO = io.StringIO
else:
# Python2
StringIO = io.BytesIO
text = '''\
1 2 3
4 5 6
'''
print(pd.read_csv(StringIO(text), sep=' '))
header
がなければ、最初の行1 2 3
は列名を設定します:
1 2 3
0 4 5 6
header=None
を使用すると、最初の行はデータとして扱われます。
print(pd.read_csv(StringIO(text), sep=' ', header=None))
プリント
0 1 2
0 1 2 3
1 4 5 6
ファイルにヘッダー行がない場合は、Pandasであるため、pd.read_csv()への呼び出しでheader = Noneを使用する必要があります。