найти среднее значение координат XYZ из файла

#python-3.x

#python #python-3.x

Вопрос:

У меня есть такой файл 4.1487753725 0.4897939031 -1.1544368391

       4.2506913391       -0.7956710981       -1.3259877915

      3.9695031790       -2.0510342090       -1.4046097748

      3.4511646710       -3.2198662126       -1.5663430729

      2.5153044314       -4.0864073852       -1.8261543415

      1.3426382182       -4.6013891404       -2.0548734271

      0.0357806676       -4.6784799702       -1.9373871780

     -1.2266940176       -4.3033231617       -2.0028733656

      3.7028052845        1.6723951131       -0.9012966155

      2.5960399662        2.3563000246       -0.6873344353

      1.3596707979        2.6502036973       -0.7101050335

      0.0775001020        2.6467774205       -0.7896014849

     -1.1666635197        2.2212285825       -1.0060401024
 

……..

я хочу сделать среднее значение первых 18 строк, а затем следующих оставшихся строк

Комментарии:

1. Не могли бы вы уточнить, вам нужно среднее значение каждые 18 строк или просто среднее значение первых 18 строк, а затем среднее значение всех строк после этого?

2. У меня есть файл с координатами XYZ длиной 36 строк, я хочу разделить эти 36 строк на две части, содержащие по 18 строк в каждом случае, и я хочу получить среднее значение этих 18 координат XYZ в обоих случаях.

Ответ №1:

Поскольку вы имеете дело с вводом-выводом, вам нужно будет прочитать в вашем файле данных и привести ваши данные к числовому типу. Вот усредненные первые 18 строк, а затем среднее значение оставшихся точек, предполагая, что ваши данные хранятся "data.txt" и хранятся в том же каталоге, где выполняется этот код.

 with open("data.txt", "r") as data_file:
    data = [line.strip().split() for line in data_file.readlines()]
    data = [[float(x) for x in line] for line in data]


first_18_avg = [[sum(x)/len(x) for x in zip(*data[:18])]]
avg_of_rest = [[sum(x)/len(x) for x in zip(*data[18:])]]
 

Если вам нужна функция, которая будет принимать средние значения каждые 18 строк, что мне кажется более разумным и что, как я предполагаю, вы имели в виду изначально:

 def find_avg_xyz(data):
    return [[sum(x)/len(x) for x in zip(*data)]]


avg_every_18_lines = []
a, b = 0, 18
for _ in range(len(data) // 18):
    avg_every_18_lines.append(find_avg_xyz(data[a:b]))
    a, b = b, b   18
 

Комментарии:

1. Спасибо за быстрый ответ, но дело в том, что у меня есть еще 50 файлов, содержащих те же данные, можно прочитать и выполнить те же вычисления для этих файлов без изменения имен файлов.

2. Что вы имеете в виду, «без изменения имен файлов»? Просто введите в него любые имена ваших файлов, with open(...) чтобы открыть любой файл, который вы хотите.

3. Большое спасибо за ваши разъяснения. Это действительно полезно, половина моей проблемы решена.

Ответ №2:

помогает ли это?

 input = [[1, 2, 2], [1, 2, 1], [1, 1, 1]]
average = [sum(x)/len(x) for x in zip(*input)]
print(average)
 

Комментарии:

1. У меня так много файлов, что я не могу выполнить [ , , ,] в каждом случае. Есть ли какой-либо другой способ решить эту проблему. и спасибо за помощь