Найти сумму пары столбцов, начиная с первого и среднего? - PullRequest
0 голосов
/ 12 ноября 2018

Мой вклад:

a b c d e f
g h i j k l

В моем выводе должно быть три набора таких решений:

Sq( a**2 + d**2 ) + Sq ( g**2 + j**2 )
Sq( b**2 + e**2 ) + Sq ( h**2 + k**2 )
Sq( c**2 + f**2 ) + Sq ( i**2 + l**2 )

В моем текстовом файле столько строк и столбцов без заголовка. Это то, что я до сих пор:

import os
import math
import numpy as np


for file in os.listdir("directory"):  
    if file.endswith(".txt"):
        fin=open(file, 'r')
        total = 0
        for line in fin:
            str = [float(x) for x in line.split()]
            for i in range(len(str[0:5])):
                str[i]=float(str[i])                   
                sum=np.sum((math.pow(str[i],2)+math.pow(str[i+3],2))**0.5
                total += sum
fin.close()

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Если вы хотите сделать это без numpy, вы можете попробовать следующее:

import math

with open("data.txt", "r") as infile:
    # Split the lines and then split numbers from each line.
    lines = list(map(str.split, infile.read().split('\n')))
    # Use zip to create tuples of values that take part in each operation.
    lines = list(zip(*lines))
    # Get length of each line.
    lineLength = len(lines)
    # Find the total.
    total = sum([math.sqrt(int(lines[i][j])**2 + int(lines[i+3][j])**2) for i in range(lineLength-3) for j in range(2)])
    print(total)

Имеется файл со следующими данными:

1 2 3 4 5 6
7 8 9 10 11 12

Результат:

57.02450048972068
0 голосов
/ 12 ноября 2018

с файлом:

1 2 3 4 5 6
11 12 13 14 15 16

Исправление отступа и диапазона:

with open('stack53269737.txt') as f:
    total = 0
    for line in f:
        str = [float(x) for x in line.split()]
        for i in range(3):
            str[i]=float(str[i])                   
            sum=np.sum((math.pow(str[i],2)+math.pow(str[i+3],2))**0.5)
            total += sum

In [111]: total
Out[111]: 73.84586902040324

с дальнейшей очисткой

with open('stack53269737.txt') as f:
    total = 0
    for line in f:
        alist = [float(x) for x in line.split()]
        for i in range(3):                   
            total += (alist[i]**2+alist[i+3]**2)**0.5

Нам не нужно конвертировать в float дважды; нам не нужны math для простых квадратов.

Numpy подход:

загрузить его с помощью считывателя CSV:

In [126]: data = np.genfromtxt('stack53269737.txt')
In [127]: data
Out[127]: 
array([[ 1.,  2.,  3.,  4.,  5.,  6.],
       [11., 12., 13., 14., 15., 16.]])

изменить форму массива, чтобы выразить разделение строк:

In [128]: data1 = data.reshape(2,2,3)
In [129]: data1
Out[129]: 
array([[[ 1.,  2.,  3.],
        [ 4.,  5.,  6.]],

       [[11., 12., 13.],
        [14., 15., 16.]]])

Теперь мы можем просто возвести в квадрат все значения, суммировать по правильной оси, взять квадратный корень и снова суммировать:

In [130]: np.sum(np.sum(data1**2, axis=1)**.5)
Out[130]: 73.84586902040324
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...