функция Питона Пифагора - PullRequest
0 голосов
/ 25 июня 2018

Итак, у меня есть набор позиционных данных, которые я получаю от заводского датчика. Он производит x, y и z информацию в метрах от известной широты / долготы. У меня есть функция, которая преобразует расстояние в метрах от широты / долготы, но мне нужно использовать данные x и y в функции Пифагора, чтобы определить это. Позвольте мне уточнить на примере данных JSON, которые дает датчик.

[
{
    "id": "84eb18677194",
    "name": "forklift_0001",
    "areaId": "Tracking001",
    "areaName": "Hall1",
    "color": "#FF0000",
    "coordinateSystemId": "CoordSys001",
    "coordinateSystemName": null,
    "covarianceMatrix": [
        0.82,
        -0.07,
        -0.07,
        0.55
    ],
    "position": [ #this is the x,y and z data, in meters from the ref point
        18.11,
        33.48,
        2.15
    ],

В этой отрасли грузоподъемник находится на 18,11 м в длину и на 33,38 м выше контрольного широты / длины. Датчик имеет высоту 2,15 м, и это постоянная часть информации, которая мне не нужна. Чтобы определить расстояние от контрольной точки, мне нужно использовать Pythagoras, а затем преобразовать эти данные обратно в широту / долготу, чтобы мой инструмент анализа мог их представить.

Моя проблема (в том, что касается python) заключается в том, что я не могу понять, как заставить его видеть 18.11 и 33.38 как x & y и сказать ему полностью игнорировать 2.15. Вот что у меня есть.

import math
import json
import pprint
import os
from glob import iglob

rootdir_glob = 'C:/Users/username/Desktop/test_folder**/*"' # Note the 
added asterisks, use forward slash
# This will return absolute paths
file_list = [f for f in 
iglob('C:/Users/username/Desktop/test_folder/13/00**/*', recursive=True) 
if os.path.isfile(f)]

for f in file_list:
    print('Input file: ' + f) # Replace with desired operations

with open(f, 'r') as f:

    distros = json.load(f)
    output_file = 'position_data_blob_14' + str(output_nr) + '.csv' #output file name may be changed


def pythagoras(a,b):
    value = math.sqrt(a*a + b*b)
    return value

result = pythagoras(str(distro['position'])) #I am totally stuck here :/
print(result)

Этот фрагмент сценария является частью более широкого проекта, предназначенного для анализа файла по машинам и людям, а также по рабочему и нерабочему времени дня.

Если бы кто-нибудь мог дать мне несколько советов о том, как заставить часть пифагора работать, я был бы очень благодарен. Я не уверен, должен ли я определить это как функцию, но, поскольку я набрал это, мне интересно, должен ли это быть цикл for, который использует x & y и игнорирует x.

Вся помощь очень ценится.

Ответы [ 4 ]

0 голосов
/ 26 июня 2018

Решение, которое я использовал, было

для f в file_list: print ('Input file:' + f) # Заменить на нужные операции

with open(f, 'r') as f:

    distros = json.load(f)
    output_file = '13_01' + str(output_nr) + '.csv' #output file name may be changed

    with open(output_file, 'w') as text_file:
        for distro in distros:      
            position = distro['position']
            result = math.sqrt(position[0]*position[0] + position[1]*position[1]), 
            print((result), file=text_file)

print('Output written to file: ' + output_file)
output_nr = output_nr + 1
0 голосов
/ 25 июня 2018

Вы передаете один вход, список чисел , в функцию, которая принимает два числа в качестве ввода.Есть два решения для этого - либо изменить то, что вы передаете, либо изменить функцию.

distro['position'] = [18.11, 33.48, 2.15], поэтому для первого решения все, что вам нужно сделать, это передать distro['position'][0] и distro['position'][1]:

result = pythagoras(distro['position'][0], distro['position'][1])

В качестве альтернативы (что, на мой взгляд, более элегантно), передайте список функции и попросите функцию извлечь значения, о которых она заботится:

result = pythagoras(distro['position'])

def pythagoras(input_triple):
    a,b,c = input_triple
    value = math.sqrt(a*a + b*b)
    return value
0 голосов
/ 25 июня 2018

Проверяли ли вы тип данных передаваемых параметров?

def pythagoras(a,b): 
    value = math.sqrt(int(a)**2 + int(b)**2)
    return value

Это в случае целых чисел.

0 голосов
/ 25 июня 2018

Попробуйте это:

position = distro['position']  # Get the full list
result = pythagoras(position[0], position[1])  # Get the first and second element from the list
print(result)

Почему вы используете str() в качестве аргумента функции?Что ты пытался сделать?

...