Создать список в зависимости от дисперсии элементов - PullRequest
0 голосов
/ 24 августа 2018

Я хочу получить список последовательных сегментов, которые являются частями линейной строки (QGIS, Shapefile) и создать почти прямой участок линейной строки.

В данный момент я могу вычислить азимут сегментов и поместить их в список.

az_list = [260,263,260,209,245,339,337,343]

Поэтому сначала я подумал о том, чтобы заполнить новый список элементами az_list, пока дисперсия не станет слишком высокой.

Пример:

Первые три значения az_list 260, 263, 260 образуют почти прямой участок линии. Я проверяю дисперсию этих трех значений с помощью:

import numpy as np
np.var([260, 263, 260])    # result: 2.0

И для последних трех:

np.var([339,337,343])    # result: 6.22...

Зная это, я мог бы определить, что для дисперсии var сечение является прямым, когда var > 0 и var < 10 и если список пуст (что будет отправной точкой) math.isnan(np.var(az_list)) возвращает False.

Я начинаю помещать первые три значения из az_list в новый список straight_list. С помощью этого кода я попытался запустить его, но он возвращает пустой список.

straight_list = []
while not math.isnan(np.var(straight_list)) and np.var(straight_list) != 0 and np.var(straight_list) < 10:
    for i in az_list:
        straight_list.append(i)

Наконец-то возникает желание получить список списка, в котором хранятся прямые секции, например:

straight_list = [[260,263,260],[339,337,343]]

1 Ответ

0 голосов
/ 24 августа 2018

Предлагаю вам следующее решение:

import numpy as np

az_list = [260,263,260,209,245,339,337,343]

straight_list = []
sublist = []
for az in az_list:
    sublist.append(az)
    if np.var(sublist) > 10:
        if len(sublist) > 2:
            straight_list.append(sublist[:-1])
        sublist = [az]

if len(sublist) > 1:
    straight_list.append(sublist)

print(straight_list)  # [[260, 263, 260], [339, 337, 343]]
...