将值插入不带索引的数组

时间:2017-12-16 00:05:58

标签: python arrays numpy

我正在尝试解析一些.out个文件,以获取每个文件中包含的值E,然后将这些值与thetar一起绘制为3d表面情节。 thetar的值包含在.out文件标题名称中:H2O.r{}theta{}.out。即r在第一个{}中给出,theta然后在下一个{}中给出。 {d}给予r {1}},给予theta 1 d.p.在文件名中,例如r = 0.90, theta = 190.0

我很难遍历文件,并将此信息提取到array E。我遇到了一个错误:

IndexError:只有整数,切片(:),省略号(...),numpy.newaxis(None)和整数或布尔数组才是有效索引。

但是,如果我将r数组更改为int以消除此错误,则r中的所有值都将变为0。另外,我从文件中提取E的代码将不再有效,因为我将输入'H2O.r0.00theta70.out',这是一个不存在的文件。有人有什么建议吗?

from numpy import *
import matplotlib.pyplot as plt
import os
os.chdir('C:/Users/myName/ex2/all')

theta = arange(70.0, 161.0, 1, dtype = float)
r = arange(0.70, 1.95, 0.05, dtype = float)
r_2dp = [ '%.2f' % elem for elem in r_O ] # string array, with rounding to match the file names
E = zeros((theta.shape[0],r.shape[0]))

def extract(filename):    #extract value from file
        filename = open(filename,"r")
        for line in filename:
            if 'SCF Done' in line:
                l = line.split()
                p = float(l[4])
        return p

for i in r_2dp:    #create E array that will allow me to plot E vs r vs theta
    for j in theta:
        for filename in os.listdir('C:/Users/myName/ex2/all'):
            if filename.startswith('H2O'):
                filename = 'H2O.r{}theta{}.out'.format(i,j)                
                E[i,j] = extract(filename)

1 个答案:

答案 0 :(得分:1)

一种解决方案是将索引与您可以使用enumerate完成的文件名相关联;我想你可以把你的循环改成

for i, fn in enumerate(r_2dp):
    for j, ti in enumerate(theta):
        for filename in os.listdir('C:/Users/myName/ex2/all'):
            if filename.startswith('H2O'):
                filename = 'H2O.r{}theta{}.out'.format(fn,ti)                
                E[j,i] = extract(filename)

请注意,我已将E[i,j]更改为E[j,i]以正确获取尺寸;你也可以改变两个for循环的顺序或者反过来初始化E ......

未经测试,因为我们无法访问您的文件,但一般的想法应该有用......