Решение проблемы макс и мин из данных входного файла

1

Я новичок в python, и мне нужна небольшая помощь с моим python script с именем search_max.py.

Он открывает формат файла "xyz", а затем выполняет поиск min и max каждой координаты. Проблема в том, что когда я делаю то же самое с awk script, я не получаю одинаковых результатов!!!

Интересно, есть ли проблема с типом данных или строковой операцией или... Может ли кто-нибудь помочь мне решить эту проблему?

Python script:

#!/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 script:

#!/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}

вы можете скачать мой входной файл здесь (14 дней): peamorphe.xyz

Заранее спасибо, Exilien.

  • 3
    В Python вы сравниваете data[...] , которые являются строкой, а не числом. Сначала нужно выполнить float() , иначе 999 > 1000 .
Теги:
file
find
input
max

1 ответ

5

Причина, по которой ваш код не работает должным образом, дается eumiro в его предыдущем комментарии.

В Python существует гораздо более простой подход: используйте 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

Эти несколько строк кода делают все, что делает ваш script, включая анализ входного файла. Если вам нужны индексы максимумов и минимумов, вы можете использовать a.argmax() и a.argmin().

Выглядит немного легче, не так ли?

  • 0
    Да, действительно :). Большое спасибо. Я не знал о Numpsy: p. Спасибо также eumiro за эту точность.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню