Как рассчитать список списка и вернуть список с плавающей точкой - PullRequest
1 голос
/ 19 мая 2019

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

Однако я не могу рассчитать список из 3 списков и вернуть список с плавающей точкой.

#calculate slope main program 
def find_slope(map_of_heights, x, y):
    ind_row = len(map_of_heights)-1
    ind_column = len(map_of_heights[0])-1

    if y in range(1, ind_column) and x in range(1, ind_row):
        #main logic
        dx = map_of_heights[y][x-1] - map_of_heights[y][x+1]
        dy = map_of_heights[y+1][x] - map_of_heights[y-1][x]

    #different cases when the point is at the edge     
    elif x == 0 and y != 0 and y!= ind_row:
        dx = 0 - map_of_heights[y][x+1]
        dy = map_of_heights[y+1][x] - map_of_heights[y-1][x]
    elif y == 0 and x != 0 and x != ind_column:
        dx = map_of_heights[y][x-1] - map_of_heights[y][x+1]
        dy = map_of_heights[y+1][x] - 0
    elif x == ind_column and y != 0 and y!= ind_row:
        dx = map_of_heights[y][x-1] - 0
        dy = map_of_heights[y+1][x] - map_of_heights[y-1][x]
    elif y == ind_row and x != 0 and x != ind_column:
        dx = map_of_heights[y][x-1] - map_of_heights[y][x+1]
        dy = 0 - map_of_heights[y-1][x]
    elif x == 0 and y == 0:
        dx = 0 - map_of_heights[y][x+1]
        dy = map_of_heights[y+1][x] - map_of_heights[0][x]
    elif x == ind_column and y == 0:
        dx = map_of_heights[y][x-1] - 0
        dy = map_of_heights[y+1][x] - 0
    elif x == 0 and y == ind_row:
        dx = 0 - map_of_heights[y][x+1]
        dy = 0 - map_of_heights[y-1][x]
    elif x == ind_column and y == ind_row:
        dx = map_of_heights[y][x-1] - 0
        dy = 0 - map_of_heights[y-1][x]
    return math.sqrt(dx**2 + dy**2)
#the test height maps
test_maps = [
        [[0, 1, 2], 
         [2, 10, 4], 
         [3, 4, 5]],
        [[10, 1, 2], 
         [2, 3, 4], 
         [3, 4, 5]],
        [[0, 1, 2], 
         [2, 3, 4], 
         [3, 4, 10]],
        [[0, 1, 10], 
         [2, 3, 10], 
         [3, 4, 10]]]

Например, в приведенных выше тестовых картах, когда x = 1 иy = 1, для первой сетки:

[[0, 1, 2], 
[2, 10, 4], 
[3, 4, 5]]]

значение, которое я выбираю, равно 10, и поэтому значение слева равно 2, справа - 4, нижнему - 4, верхнему - 1.Затем примените формулу sqrt ((слева - справа) ** 2 + (снизу - вверх) ** 2), 3.605551275463989 в качестве результата.

TypeError: unsupported operand type(s) for -: 'list' and 'list'

#test case
find_slope(test_maps, 1, 1)
#expected output
[3.605551275463989, 3.605551275463989, 3.605551275463989, 8.54400374531753]

Ответы [ 2 ]

0 голосов
/ 19 мая 2019

Как уже отмечал Javadmk, вы не можете просто вычесть списки с помощью оператора -. Если вы хотите выполнить подобную операцию для элемента списка за элементом, я бы предложил использовать numpy, поскольку он поддерживает такие операции «из коробки».

Использование решения Javadmk привело к еще одной ошибке, так как следующая строка не поддерживает операции со списками: return math.sqrt(dx**2 + dy**2)

Если вы добавите эту строку в свой импорт:

import numpy as np

И замените инициализацию списка следующим образом:

test_maps = np.array([[[0, 1, 2], [2, 10, 4], [3, 4, 5]], [[10, 1, 2], [2, 3, 4], [3, 4, 5]], [[0, 1, 2], [2, 3, 4], [3, 4, 10]],  [[0, 1, 10], [2, 3, 10], [3, 4, 10]]])

И вычисление квадратного корня производится следующим образом:

return np.sqrt(dx**2 + dy**2)

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

0 голосов
/ 19 мая 2019

Как говорит ошибка, вы не можете вычесть два списка с помощью оператора '-', если не перезаписать / не перегрузить __sub__ метод. Но есть более простой способ сделать это:

f = lambda a, b: [a[i]-b[i] for i in range(len(a))]

Пример:

>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> f(a, b)
[-3, -3, -3]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...