Arhn - архитектура программирования

Найти неправильную область в массиве 4D numpy данных с координатной сеткой (широта/долгота)

У меня есть большой 4-мерный набор данных о температуре [время, давление, широта, долгота]. Мне нужно найти все точки сетки в области, определяемой индексами широты и долготы, и вычислить среднее значение по области, чтобы оставить мне двумерный массив.

Я знаю, как это сделать, если моя область представляет собой прямоугольник (или квадрат), но как это сделать с неправильным многоугольником?

Ниже приведено изображение, показывающее регионы, которые мне нужно усреднить вместе, и сетку широты и долготы, к которой данные привязаны к сетке в массиве.

сетка широты/долготы с регионами для усреднения


  • Как определяется ваш полигон? 08.12.2015
  • Полигоны в настоящее время определяются только в arcgis на основе terrian и корреляции данных наблюдений. Сетка, наложенная в верхней части изображения, была создана на основе значений широты и долготы модели, а затем смещена таким образом, что точки сетки модели находятся в центре квадратов выше. 08.12.2015
  • Теперь мне нужно найти эти точки сетки в 4D-массиве размером 38x5000x30x20 (плюс-минус), если области, где квадрат, я бы использовал numpy.where, чтобы найти индексы между востоком и западом, севером и югом, а затем нарезать массив с этими диапазонами, но Я не знаю, как лучше всего найти эти неправильные формы. 08.12.2015
  • Можете ли вы привести пример (даже упрощенный) определения такого многоугольника? Это большая условная функция координат? список вершин? список всех ячеек, принадлежащих многоугольнику?... Как это определено в вашем коде Python? 08.12.2015
  • Пример 1: маленькое зеленое квадратное поле temp[:,:,(широта›=37)&(широта‹=37,25),(долгота‹=-122,125)&(долгота›=-122,375)] Пример 2: маленький 6-сторонний фиолетовый полигон. Я хочу, чтобы все содержалось между вершинами lat‹=38,125, lon›=-122,875 и lat‹38,125, lon‹=-122,375 и lat›=37,75, lon‹=-122,375 и lat›=37,75, lon›=-122,625 и широта›=37,875, долгота›=-122,625 и широта›=37,875, долгота›=-122,875 08.12.2015
  • Таким образом, пример1 определяется как условная функция, а пример2 — как список вершин. Ваши полигоны не все определены согласованным образом? Или вы просто вручную преобразовали список вершин в условную функцию например1, потому что в этом случае это легко? 09.12.2015

Ответы:


1

Я считаю, что это должно решить вашу проблему.

Приведенный ниже код генерирует все ячейки полигона, определенного списком вершин. Он «сканирует» полигон строку за строкой, отслеживая переходные столбцы, в которых вы (повторно) входите или выходите из полигона.

def row(x, transitions):
    """ generator spitting all cells in a row given a list of transition (in/out) columns."""

    i = 1
    in_poly = True
    y = transitions[0]
    while i < len(transitions):
        if in_poly:
            while y < transitions[i]:
                yield (x,y)
                y += 1
            in_poly = False
        else:
            in_poly = True
            y = transitions[i]
        i += 1


def get_same_row_vert(i, vertices):
    """ find all vertex columns in the same row as vertices[i], and return next vertex index as well."""

    vert = []
    x = vertices[i][0]
    while i < len(vertices) and vertices[i][0] == x:
        vert.append(vertices[i][1])
        i += 1
    return vert, i


def update_transitions(old, new):
    """ update old transition columns for a row given new vertices. 

    That is: merge both lists and remove duplicate values (2 transitions at the same column cancel each other)"""

    if old == []:
        return new
    if new == []:
        return old
    o0 = old[0]
    n0 = new[0]
    if o0 == n0:
        return update_transitions(old[1:], new[1:])
    if o0 < n0:
        return [o0] + update_transitions(old[1:], new)
    return [n0] + update_transitions(old, new[1:])


def polygon(vertices):
    """ generator spitting all cells in the polygon defined by given vertices."""

    vertices.sort()
    x = vertices[0][0]
    transitions, i = get_same_row_vert(0, vertices)
    while i < len(vertices):
        while x < vertices[i][0]:            
            for cell in row(x, transitions):
                yield cell
            x += 1
        vert, i = get_same_row_vert(i, vertices)
        transitions = update_transitions(transitions, vert)


# define a "strange" polygon (hook shaped)
vertices = [(0,0),(0,3),(4,3),(4,0),(3,0),(3,2),(1,2),(1,1),(2,1),(2,0)]

for cell in polygon(vertices):
    print cell
    # or do whatever you need to do
09.12.2015

2

Общий класс задач называется "Point in Polygon", где (достаточно) стандартный алгоритм на основе проведения тестовой линии через рассматриваемую точку и подсчета количества раз, когда она пересекает границы полигона (это действительно круто/странно, что это работает так просто, я думаю). Это действительно хороший обзор, включающий информацию о реализации.

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

  • Для каждого региона сформируйте список всех квадратов (широта/долгота), которые его определяют. В зависимости от того, как определены ваши регионы, это может быть тривиальным или раздражающим...

  • Для каждой точки, которую вы исследуете, выясните, в каком квадрате она находится. Поскольку квадраты так хорошо себя ведут, вы можете сделать это вручную, используя противоположные углы каждого квадрата, или используя метод, подобный numpy.digitize.

  • Проверить, находится ли квадрат, в котором находится точка, в одном из регионов.

Если у вас по-прежнему возникают проблемы, предоставьте дополнительные сведения о вашей проблеме (в частности, о том, как определяются ваши регионы) --- это облегчит предоставление совета.

08.12.2015
  • Пожалуйста, смотрите комментарий выше. Спасибо или ваша помощь. 08.12.2015
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..