2011-01-25 3 views
1

저는 python에 익숙하지 않아 search_max.py라는 이름의 Python 스크립트에 약간의 도움이 필요합니다.입력 파일 데이터에서 최대 및 최소 문제를 해결하는 문제

파일 "xyz"형식을 연 다음 각 coord의 최소 및 최대를 검색합니다. 문제는 awk 스크립트와 동일한 작업을 수행 할 때 동일한 재구성 결과를 얻지 못하는 경우입니다.

데이터 형식이나 문자열 연산에 문제가 있는지 궁금합니다. 누구든지이 문제를 해결할 수 있습니까?

파이썬 스크립트 :

#!/usr/bin/python 
# -*- coding: iso-8859-15 -*- 
inputfile = "peamorphe.xyz" 
outputfile = "result.txt" 
# open the input file 
infile = open(inputfile, "r") 
# read line 1 : number of atoms 
atomsno = infile.readline().rstrip('\n').split(" ") 
# read line 2 : name of the system 
systemname = infile.readline().rstrip('\n') 
# read line 3 : initialisation for min and max 
temp2 = infile.readline().rstrip('\n').split(" ") 
zmin = temp2[3] 
zmax = temp2[3] 
ymax = temp2[2] 
ymin = temp2[2] 
xmax = temp2[1] 
xmin = temp2[1] 
lineno = 3 
print zmax, ymin, xmin 
# read other lines 
for ligne in infile.readlines(): 
    lineno = lineno + 1 
    # extraction and strip of data spaced by " " 
    data = ligne.rstrip('\n\r').split(" ") 
    # Conditions for min and max 
    if data[1] < xmin: 
     xmin = data[1] 
     wclxmin = lineno 
    if data[1] > xmax: 
     xmax = data[1] 
     wclxmax = lineno 
    if data[2] < ymin: 
     ymin = data[2] 
     wclymin = lineno 
    if data[2] > ymax: 
     ymax = data[2] 
     wclymax = lineno 
    if data[3] < zmin: 
     zmin = data[3] 
     wclzmin = lineno 
    if data[3] > zmax: 
     zmax = data[3] 
     wclzmax = lineno 

# Evaluation of centers 
zcenter = float(zmax)-float(zmin) 
ycenter = float(ymax)-float(ymin) 
xcenter = float(xmax)-float(xmin) 

# open the input file 
infile = open(inputfile, "r") 
# read line 1 : number of atoms 
atomsno = infile.readline().rstrip('\n').split(" ") 
# read line 2 : name of the system 
systemname = infile.readline().rstrip('\n') 
# read line 3 : initialisation for min and max 
temp2 = infile.readline().rstrip('\n').split(" ") 
zmin = temp2[3] 
zmax = temp2[3] 
ymax = temp2[2] 
ymin = temp2[2] 
xmax = temp2[1] 
xmin = temp2[1] 
lineno = 3 
print zmax, ymin, xmin 
# read other lines 
for ligne in infile.readlines(): 
    lineno = lineno + 1 
    # extraction and strip of data spaced by " " 
    data = ligne.rstrip('\n\r').split(" ") 
    # Conditions for min and max 
    if data[1] < xmin: 
     xmin = data[1] 
     wclxmin = lineno 
    if data[1] > xmax: 
     xmax = data[1] 
     wclxmax = lineno 
    if data[2] < ymin: 
     ymin = data[2] 
     wclymin = lineno 
    if data[2] > ymax: 
     ymax = data[2] 
     wclymax = lineno 
    if data[3] < zmin: 
     zmin = data[3] 
     wclzmin = lineno 
    if data[3] > zmax: 
     zmax = data[3] 
     wclzmax = lineno 

# Evaluation of centers 
zcenter = float(zmax)-float(zmin) 
ycenter = float(ymax)-float(ymin) 
xcenter = float(xmax)-float(xmin) 

awk 스크립트는 :

peamorphe.xyz가 사전에 Exilien 감사 :

#!/usr/bin/awk -f 
# from a xyz file 
BEGIN{ 
xmax;xmin; 
zmax;zmin; 
ymax;ymin; 
xcent;ycent;zcent; 
xcent = (xmax-xmin)/2; 
ycent = (ymax-ymin)/2; 
zcent = (zmax-zmin)/2; 
print "At the start of the script"; 
print "xmax = " xmax "; " "xmin = " xmin "; xcent = " xcent; 
print "ymax = " ymax "; " "ymin = " ymin "; ycent = " ycent; 
print "zmax = " zmax "; " "zmin = " zmin "; zcent = " zcent; 
print ""; 
} 

{ 
if (xmax<$2) xmax = $2 
if (xmin>$2) xmin = $2 
if (ymax<$3) ymax = $3 
if (ymin>$3) ymin = $3 
if (zmax<$4) zmax = $4 
if (zmin>$4) zmin = $4 
} 

END{ 
xcent = (xmax-xmin)/2; 
ycent = (ymax-ymin)/2; 
zcent = (zmax-zmin)/2; 
print "At the end of the script"; 
print "xmax = " xmax "; " "xmin = " xmin "; xcent = " xcent; 
print "ymax = " ymax "; " "ymin = " ymin "; ycent = " ycent; 
print "zmax = " zmax "; " "zmin = " zmin "; zcent = " zcent} 

당신은 여기 내 입력 파일 (십사일)를 다운로드 할 수 있습니다.

+3

파이썬에서는 숫자가 아닌 문자열 인'data [...] '를 비교합니다. 먼저 float()해야하며 그렇지 않으면'999> 1000'입니다. – eumiro

답변

5

코드가 예상대로 작동하지 않는 이유는 위의 설명에서 eumiro가 제공 한 것입니다.

파이썬에서는 훨씬 쉬운 방법이 있습니다 : NumPy을 사용하십시오. 최대 및 파일의 각 열의 최소값에 대한 예제 코드

import numpy 
a = numpy.loadtxt("peamorphe.xyz", skiprows=2, usecols=(1, 2, 3)) 
max_xyz = a.max(axis=0) 
min_xyz = a.min(axis=0) 
center = max_xyz - min_xyz 

코드이 몇 줄의 입력 파일을 구문 분석을 포함하여 스크립트가 수행 모든 것을 할 것입니다. 최대 및 최소 색인도 필요하면 a.argmax()a.argmin()을 사용할 수 있습니다.

꽤 쉽게 보입니다. 그렇죠?

+0

그래, 정말로 :). 고마워. 나는 Numpy에 대해 몰랐다 : p. 이 정밀도에 대해 감사합니다. – Exilien