好吧。我有一些Matlab的背景知识,现在我转向Python。 我在64位Linux上的Pythnon 2.6.5下有这段代码,它在目录中滚动,找到名为'通用数据.dat,从中检索一些数据并将它们缝合到新的数据集中:
import pylab as p
import os, re
import linecache as ln
def LoadGenomeMeanSize(arg, dirname, files):
for file in files:
filepath = os.path.join(dirname, file)
if filepath == os.path.join(dirname,'GeneralData.dat'):
data = p.genfromtxt(filepath)
if data[-1,4] != 0.0: # checking if data set is OK
data_chopped = data[1000:-1,:] # removing some of data
Grand_mean = data_chopped[:,2].mean()
Grand_STD = p.sqrt((sum(data_chopped[:,4]*data_chopped[:,3]**2) + sum((data_chopped[:,2]-Grand_mean)**2))/sum(data_chopped[:,4]))
else:
break
if filepath == os.path.join(dirname,'ModelParams.dat'):
l = re.split(" ", ln.getline(filepath, 6))
turb_param = float(l[2])
arg.append((Grand_mean, Grand_STD, turb_param))
GrandMeansData = []
os.path.walk(os.getcwd(), LoadGenomeMeanSize, GrandMeansData)
GrandMeansData = sorted(GrandMeansData, key=lambda data_sort: data_sort[2])
TheMeans = p.zeros((len(GrandMeansData), 3 ))
i = 0
for item in GrandMeansData:
TheMeans[i,0] = item[0]
TheMeans[i,1] = item[1]
TheMeans[i,2] = item[2]
i += 1
print TheMeans # just checking...
# later do some computation on TheMeans in NumPy
它让我想起了这个(尽管我发誓这是一个月的自我):
^{pr2}$好吧。。。所以我去读了一下,得出了一个全局变量:
import pylab as p
import os, re
import linecache as ln
Grand_mean = p.nan
Grand_STD = p.nan
def LoadGenomeMeanSize(arg, dirname, files):
for file in files:
global Grand_mean
global Grand_STD
filepath = os.path.join(dirname, file)
if filepath == os.path.join(dirname,'GeneralData.dat'):
data = p.genfromtxt(filepath)
if data[-1,4] != 0.0: # checking if data set is OK
data_chopped = data[1000:-1,:] # removing some of data
Grand_mean = data_chopped[:,2].mean()
Grand_STD = p.sqrt((sum(data_chopped[:,4]*data_chopped[:,3]**2) + sum((data_chopped[:,2]-Grand_mean)**2))/sum(data_chopped[:,4]))
else:
break
if filepath == os.path.join(dirname,'ModelParams.dat'):
l = re.split(" ", ln.getline(filepath, 6))
turb_param = float(l[2])
arg.append((Grand_mean, Grand_STD, turb_param))
GrandMeansData = []
os.path.walk(os.getcwd(), LoadGenomeMeanSize, GrandMeansData)
GrandMeansData = sorted(GrandMeansData, key=lambda data_sort: data_sort[2])
TheMeans = p.zeros((len(GrandMeansData), 3 ))
i = 0
for item in GrandMeansData:
TheMeans[i,0] = item[0]
TheMeans[i,1] = item[1]
TheMeans[i,2] = item[2]
i += 1
print TheMeans # just checking...
# later do some computation on TheMeans in NumPy
它不提供错误消息。甚至给了一个包含数据的文件。。。但数据是大错特错了!我通过运行命令手动检查了其中一些:
import pylab as p
data = p.genfromtxt(filepath)
data_chopped = data[1000:-1,:]
Grand_mean = data_chopped[:,2].mean()
Grand_STD = p.sqrt((sum(data_chopped[:,4]*data_chopped[:,3]**2) \
+ sum((data_chopped[:,2]-Grand_mean)**2))/sum(data_chopped[:,4]))
在选定的文件上。它们是不同的:-(
1)谁能给我解释一下怎么了?在
2)有人知道解决办法吗?在
我将非常感谢您的帮助:-)
干杯, PTR
使用global不是正确的解决方案。只有当你确实想引用并分配到全局“Grand_mean”名称时,这才有意义。解释器需要在解释器中指定运算符。在
您应该首先在
LoadGenomeMeanSize()
的范围内为Grand_mean
分配一个默认值。您有4个分支中的1个实际为Grand_mean赋值,该值在一个循环迭代中具有正确的语义意义。你可能会遇到一个if filepath == os.path.join(dirname,'ModelParams.dat'):
为真,但是if filepath == os.path.join(dirname,'GeneralData.dat'):
或{快速而肮脏的答案是,您可能需要像这样重新排列代码:
我看到代码和您提供的解决方案有一个问题。在
在创建全局变量“Grand_mean”之前,您遇到了一个问题,即在分配任何值之前访问Grand_mean。在这种情况下,通过在函数外部初始化变量并将其标记为全局变量,只会隐藏问题。在
你看到了错误的结果,因为现在你已经使变量可见,我使它成为全局变量,但问题仍然存在。你的意思是从来没有得到正确的数据。在
这意味着“if filepath==os.path.join操作系统(dirname,…”从未执行过。在
我想说这个条件没有通过:
if filepath == os.path.join(dirname,'GeneralData.dat'):
也就是说你得不到通用数据.dat以前模型参数.dat. 也许你需要按字母顺序排序,或者文件不在那里。在
相关问题 更多 >
编程相关推荐