Расчет значений сетки с учетом расстояния в питоне - PullRequest
0 голосов
/ 18 октября 2018

У меня клеточная сетка больших размеров.Каждая ячейка имеет идентификатор (p1), значение ячейки (p3) и координаты в фактических мерах (X, Y).Вот так выглядят первые 10 строк / ячеек

      p1     p2          p3     X  Y
0      0     0.0         0.0    0  0
1      1     0.0         0.0  100  0
2      2     0.0        12.0  200  0
3      3     0.0         0.0  300  0
4      4     0.0        70.0  400  0
5      5     0.0        40.0  500  0
6      6     0.0        20.0  600  0
7      7     0.0         0.0  700  0
8      8     0.0         0.0  800  0
9      9     0.0         0.0  900  0

Соседние ячейки ячейки i в p1 можно определить как (i-500+1, i-500-1, i-1, i+1, i+500+1, i+500-1).Например: p1 из 5 имеет соседей - 4 60 504 505 506.(это идентификатор строк в верхней таблице - p1).

Я пытаюсь сделать следующее: Для выбранного значения / строки i в p1 я хотел бы знать всесоседей на выбранном расстоянии от i и суммируйте все их p3 значения.

Я пытался применить это решение ( ссылка ), но я не знаю, как включитьпараметр расстояния.Значение ячейки может быть взято с помощью df.iloc, но шаги до этого немного сложны для меня.

Можете ли вы дать мне какой-нибудь совет?

РЕДАКТИРОВАТЬ: Используя решение от Томаса ивызвав df CO:

      p3
0     45
1    580
2  12000
3  12531
4  22456

Я хотел бы добавить еще один столбец и использовать значения из p3 столбцов

CO['new'] = format(sum_neighbors(data, CO['p3']))

Но это не работает.Если я добавлю число вместо ссылки на строку CO['p3'], это будет работать как шарм.Но как я могу автоматически использовать значения из столбца p3 в функции format?

РЕШЕНО: Работает с:

CO['new'] = CO.apply(lambda row: sum_neighbors(data, row.p3), axis=1)

1 Ответ

0 голосов
/ 18 октября 2018

Решение:

import numpy as np
import pandas

# Generating toy data
N = 10
data = pandas.DataFrame({'p3': np.random.randn(N)})
print(data)

# Finding neighbours
get_candidates = lambda i: [i-500+1, i-500-1, i-1, i+1, i+500+1, i+500-1]
filter = lambda neighbors, N: [n for n in neighbors if 0<=n<N]
get_neighbors = lambda i, N: filter(get_candidates(i), N)

print("Neighbors of 5: {}".format(get_neighbors(5, len(data))))

# Summing p3 on neighbors
def sum_neighbors(data, i, col='p3'):
  return data.iloc[get_neighbors(i, len(data))][col].sum()

print("p3 sum on neighbors of 5: {}".format(sum_neighbors(data, 5)))

Вывод:

         p3
0 -1.106541
1 -0.760620
2  1.282252
3  0.204436
4 -1.147042
5  1.363007
6 -0.030772
7 -0.461756
8 -1.110459
9 -0.491368

Neighbors of 5: [4, 6]

p3 sum on neighbors of 5: -1.1778133703169344

Примечания:

  • Я предположил, что p1 было range(N), как казалось, подразумевается(поэтому нам это вообще не нужно).
  • Я не думаю, что 505 является соседом 5, учитывая список соседей i, определенный ОП.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...