为不同的数据文件循环相同的程序

时间:2013-08-07 20:22:20

标签: python numpy matplotlib

对于以下程序,我试图节省复制和粘贴大量代码的时间。我希望这个程序使用数据文件19_6.txt和aux.19_6进行绘图,然后继续绘制带有相同代码的11,12,20,28,27和18在19位的文件并放在同一个程序上情节。任何帮助,将不胜感激。谢谢!

from numpy import *
import matplotlib.pyplot as plt

datasim19 = loadtxt("/home/19_6.txt")                         
data19 = loadtxt("/home/aux.19_6")                         

no1=1
no2=2
no3=3
no4=4
no5=5

no7=7
no8=8
no9=9
no10=10

simrecno1inds19 = nonzero(datasim19[:,1]==no1)[0]
simrecno2inds19 = nonzero(datasim19[:,1]==no2)[0]
simrecno3inds19 = nonzero(datasim19[:,1]==no3)[0]
simrecno4inds19 = nonzero(datasim19[:,1]==no4)[0]
simrecno5inds19 = nonzero(datasim19[:,1]==no5)[0]

simrecno7inds19 = nonzero(datasim19[:,1]==no7)[0]
simrecno8inds19 = nonzero(datasim19[:,1]==no8)[0]
simrecno9inds19 = nonzero(datasim19[:,1]==no9)[0]
simrecno10inds19 = nonzero(datasim19[:,1]==no10)[0]


recno1inds19 = nonzero(data19[:,1]==no1)[0]
recno2inds19 = nonzero(data19[:,1]==no2)[0]
recno3inds19 = nonzero(data19[:,1]==no3)[0]
recno4inds19 = nonzero(data19[:,1]==no4)[0]
recno5inds19 = nonzero(data19[:,1]==no5)[0]

recno7inds19 = nonzero(data19[:,1]==no7)[0]
recno8inds19 = nonzero(data19[:,1]==no8)[0]
recno9inds19 = nonzero(data19[:,1]==no9)[0]
recno10inds19 = nonzero(data19[:,1]==no10)[0]



q1sim19 = qsim19[simrecno1inds19]
q2sim19 = qsim19[simrecno2inds19]
q3sim19 = qsim19[simrecno3inds19]
q4sim19 = qsim19[simrecno4inds19]
q5sim19 = qsim19[simrecno5inds19]

q7sim19 = qsim19[simrecno7inds19]
q8sim19 = qsim19[simrecno8inds19]
q9sim19 = qsim19[simrecno9inds19]
q10sim19 = qsim19[simrecno10inds19]

q1_19 = q19[recno1inds19]
q2_19 = q19[recno2inds19]
q3_19 = q19[recno3inds19]
q4_19 = q19[recno4inds19]
q5_19 = q19[recno5inds19]

q7_19 = q19[recno7inds19]
q8_19 = q19[recno8inds19]
q9_19 = q19[recno9inds19]
q10_19 = q19[recno10inds19]

sumq1sim19 = sum(q1sim19)
sumq2sim19 = sum(q2sim19)
sumq3sim19 = sum(q3sim19)
sumq4sim19 = sum(q4sim19)
sumq5sim19 = sum(q5sim19)

sumq7sim19 = sum(q7sim19)
sumq8sim19 = sum(q8sim19)
sumq9sim19 = sum(q9sim19)
sumq10sim19 = sum(q10sim19)

sumq1_19 = sum(q1_19)
sumq2_19 = sum(q2_19)
sumq3_19 = sum(q3_19)
sumq4_19 = sum(q4_19)
sumq5_19 = sum(q5_19)

sumq7_19 = sum(q7_19)
sumq8_19 = sum(q8_19)
sumq9_19 = sum(q9_19)
sumq10_19 = sum(q10_19)


xsim = [no1, no2, no3, no4, no5, no7, no8, no9, no10]
ysim = [sumq1sim_19, sumq2sim_19, sumq3sim_19, sumq4sim_19, sumq5sim_19, sumq7sim_19, sumq8sim_19, sumq9sim_19, sumq10sim_19]

x = [no1, no2, no3, no4, no5,no7, no8, no9, no10]
y = [sumq1_19, sumq2_19, sumq3_19, sumq4_19, sumq5_19, sumq7_19, sumq8_19, sumq9_19, sumq10_19]

plt.plot(x,log(y),'b',label='Data')
plt.plot(xsim,log(ysim),'r',label='Simulation')
plt.legend()
plt.title('Data vs. Simulation')
plt.show()

3 个答案:

答案 0 :(得分:4)

提示:当你发现自己使用了许多名为n1,n2,n3等变量时,你应该使用列表,词典或其他类似的容器,而不是循环。

例如,尝试替换以下代码:

simrecno1inds19 = nonzero(datasim19[:,1]==no1)[0]
simrecno2inds19 = nonzero(datasim19[:,1]==no2)[0]
simrecno3inds19 = nonzero(datasim19[:,1]==no3)[0]
simrecno4inds19 = nonzero(datasim19[:,1]==no4)[0]
simrecno5inds19 = nonzero(datasim19[:,1]==no5)[0]

simrecno7inds19 = nonzero(datasim19[:,1]==no7)[0]
simrecno8inds19 = nonzero(datasim19[:,1]==no8)[0]
simrecno9inds19 = nonzero(datasim19[:,1]==no9)[0]
simrecno10inds19 = nonzero(datasim19[:,1]==no10)[0]

有了这个:

simrecinds19 = [nonzero(datasim19[:,1] == i)[0] for i in range(1, 11)]

然后,您可以使用simrecinds19[0]代替simrecno1inds19

答案 1 :(得分:1)

您可以这样做:

nList = [19,11,12,20,28,27,18]

for n in nList:
    file1 = "/home/" + str(n) + "_6.txt"
    file2 = "/home/aux." + str(n) + "_6"

    datasim19 = loadtxt(file1)                         
    data19 = loadtxt(file2)  

    # do the rest of the plotting

答案 2 :(得分:0)

您可以大大减少此脚本的大小。我不太确定qsim19qsim的来源,但请看一下:

import numpy as np
import matplotlib.pyplot as plt

for index in [19, 11, 12, 20, 28, 27, 18]:
    datasim = loadtxt("/home/%i_6.txt"%index)                         
    data = loadtxt("/home/aux.%i_6"%index)                         

    nos = range(1, 6) + range(7, 11)

    simrecno = [np.nonzero(datasim[:,1] == n)[0] for n in nos]
    recno = [np.nonzero(data[:,1] == n)[0] for n in nos]

    qsim = [qsim[simrecno_i] for simrecno_i in simrecno]
    q = [q[recno_i] for recno_i in recno]

    sumqsim = [sum(qsim_i) for qsim_i in qsim]
    sumq = [sum(q_i) for q_i in q]

    xsim = nos
    ysim = sumqsim

    x = nos
    y = sumq

    plt.plot(x, log(y), 'b', label='Data')
    plt.plot(xsim, log(ysim), 'r', label='Simulation')
    plt.legend()
    plt.title('Data vs. Simulation')
    plt.show()