次のpythonスクリプトを実行しています。
#!/usr/bin/python
import os,sys
from scipy import stats
import numpy as np
f=open('data2.txt', 'r').readlines()
N=len(f)-1
for i in range(0,N):
w=f[i].split()
l1=w[1:8]
l2=w[8:15]
list1=[float(x) for x in l1]
list2=[float(x) for x in l2]
result=stats.ttest_ind(list1,list2)
print result[1]
しかし、私は次のようなエラーを受け取りました:
ValueError: could not convert string to float: id
私はこれに混乱しています。スクリプトを使用したforループの代わりに、インタラクティブセクションの1行だけでこれを試してみると:
>>> from scipy import stats
>>> import numpy as np
>>> f=open('data2.txt','r').readlines()
>>> w=f[1].split()
>>> l1=w[1:8]
>>> l2=w[8:15]
>>> list1=[float(x) for x in l1]
>>> list1
[5.3209183842, 4.6422726719, 4.3788135547, 5.9299061614, 5.9331108706, 5.0287087832, 4.57...]
うまくいきました。
誰でもこれについて少し説明できますか? THX
明らかに、一部の行には有効な浮動小数点データがありません。具体的には、一部の行には浮動小数点に変換できないテキストid
があります。
対話型プロンプトで試してみると、最初の行のみを試しており、このエラーが発生している行を印刷するのが最善の方法です。
#!/usr/bin/python
import os,sys
from scipy import stats
import numpy as np
f=open('data2.txt', 'r').readlines()
N=len(f)-1
for i in range(0,N):
w=f[i].split()
l1=w[1:8]
l2=w[8:15]
try:
list1=[float(x) for x in l1]
list2=[float(x) for x in l2]
except ValueError,e:
print "error",e,"on line",i
result=stats.ttest_ind(list1,list2)
print result[1]
私のエラーは非常に簡単でした。データを含むテキストファイルの最後の行にスペース(見えない)文字がありました。
Grepの出力として、45
の代わりに45
がありました。
このエラーはかなり冗長です。
ValueError: could not convert string to float: id
Somewhereテキストファイルでは、行に__ id
という単語が含まれていますが、実際には数値に変換できません。
Word id
がline 2
にないため、テストコードは機能します。
その行をキャッチしたい場合は、このコードを試してください。コードを少し整理しました。
#!/usr/bin/python
import os, sys
from scipy import stats
import numpy as np
for index, line in enumerate(open('data2.txt', 'r').readlines()):
w = line.split(' ')
l1 = w[1:8]
l2 = w[8:15]
try:
list1 = map(float, l1)
list2 = map(float, l2)
except ValueError:
print 'Line {i} is corrupt!'.format(i = index)'
break
result = stats.ttest_ind(list1, list2)
print result[1]
あなたのデータはあなたが期待するものではないかもしれません-あなたは期待しているようですが、フロートを取得していません。
これが発生する場所を特定するための簡単な解決策は、forループにtry/exceptを追加することです。
for i in range(0,N):
w=f[i].split()
l1=w[1:8]
l2=w[8:15]
try:
list1=[float(x) for x in l1]
list2=[float(x) for x in l2]
except ValueError, e:
# report the error in some way that is helpful -- maybe print out i
result=stats.ttest_ind(list1,list2)
print result[1]
おそらくあなたの数字は実際には数字ではなく、数字を装った文字でしょうか?
私の場合、私が使用していたフォントは、「l」と「1」が非常に似ていることを意味していました。 「11919」だと思っていた「l1919」のような文字列があり、それはめちゃくちゃになりました。