Вороной не отображает индекс кортежа данных в реальном времени вне диапазона - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь построить диаграмму вороного с данными в реальном времени, но получаю ошибку:

IndexError: tuple index out of range

код:

data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes

data = str(data, "utf-8") #convert bytes into string and fix the 'b'
#data.decode("utf-8", errors="ignore")

data = data.strip(" ").split(".")

x = data[0]
y = data[1]
x = float(x.replace( ',', '.'))
y = float(y.replace( ',', '.'))
vor = Voronoi(x,y)

code and error

Значение переменной data выглядит следующим образом: [b' 0,2036377.2,04291.', b' 0,2027879.2,040747.'].

Есть идеи, как это исправить?

1 Ответ

0 голосов
/ 24 апреля 2020

Как упоминалось в комментариях, ошибка, которую вы получаете, заключается в том, что вы передаете неправильный ввод в Voronoi, пожалуйста, прочитайте документацию

Относительно того, что вы пытаетесь сделать и предполагая, что data, который вы получаете от data, addr = sock.recvfrom(1024), похож на [b' 0,2036377.2,04291.', b' 0,2027879.2,040747.'], вам нужно обратиться к следующим пунктам:

  • декодировать байты в строку
  • extract координаты, используя, например, регулярное выражение
  • , преобразуют строковое представление координат в float
  • , организуют структуру данных для создания Voronoi диаграммы

Код, который у вас есть, адресован большинству из этих точек, но он не структурирует данные как входные данные для диаграммы Voronoi.

Код ниже адресован всем точкам и создаст диаграмму Voronoi для вас:

import re
from scipy.spatial import Voronoi, voronoi_plot_2d
import matplotlib.pyplot as plt
import doctest
doctest.testmod()  # used to test the docstring 

# compile the regular expression used to parse the input data
regex = re.compile(' (\d+,\d+)\.(\d+,\d+)\.')

def parse_data(data):
    """
    parse a list of strings with x, y coordinates

    >>> data = [b' 0,2036377.2,04291.', b' 0,2027879.2,040747.']
    >>> parse_data(data)
    [[0.2036377, 2.04291], [0.2027879, 2.040747]]
    """
    proc_data = []
    for i in data:
        m = regex.match(i.decode('utf-8')) # decode the bytes and match the regex
        if m:
            # parse the coordinates and organise the data structure
            proc_data += [[float(m.group(1).replace(',','.')),
                           float(m.group(2).replace(',','.'))]]
    return proc_data

data = [b' 0,2036377.2,04291.', b' 0,2027879.2,040747.', 
        b' 0,2018921.2,037455.', b' 0,2010467.2,034439.', 
        b' 0,2004007.2,031721.', b' 0,1996321.2,027795.',
        b' 0,1989551.2,023898.', b' 0,1983429.2,020666.',
        b' 0,1978466.2,017263.']

data = parse_data(data)
vor = Voronoi(data)  # create the Voronoi diagram with correct input data
voronoi_plot_2d(vor)
plt.show()

Результат следующий: Imgur

...