анализ дополнительных атрибутов ближайшего члена - PullRequest
1 голос
/ 14 марта 2020

У меня есть следующий фрейм данных df (образец):

         lat        lon  crs   Band1              x             y
0  41.855584  20.619156  b''  1568.0  468388.198606  4.633812e+06
1  41.855584  20.622590  b''  1562.0  468673.173031  4.633811e+06
2  41.855584  20.626023  b''  1605.0  468958.147443  4.633810e+06
3  41.859017  20.612290  b''  1598.0  467819.970900  4.634196e+06
4  41.859017  20.615723  b''  1593.0  468104.930108  4.634195e+06
5  41.859017  20.619156  b''  1600.0  468389.889303  4.634193e+06
6  41.859017  20.622590  b''  1586.0  468674.848486  4.634192e+06
7  41.859017  20.626023  b''  1577.0  468959.807656  4.634191e+06
8  41.859017  20.629456  b''  1584.0  469244.766814  4.634190e+06
9  41.859017  20.632889  b''  1598.0  469529.725959  4.634188e+06

поля x и y - координаты в плоскости xy, а Band1 - высота точки (по сути это координата z) , Кадр данных представляет собой прямоугольную сетку с x и y в качестве центральной координаты сетки и Band1 в качестве высоты сетки.

Как определить, какая из ячеек сетки имеет наивысший показатель в Band1 по сравнению с соседними ячейками?

Ожидаемый результат в этом случае - дополнительный столбец в кадре данных с логическим значением, определяющим, что ячейка имеет наивысшую высоту Band1 перед соседними 4 ячейками.

Я могу легко получить соседние расстояния сетки и индексы с помощью:

X=df[['x','y']].to_numpy()
nbrs = NearestNeighbors(n_neighbors=5, algorithm='ball_tree').fit(X)
distances, indices = nbrs.kneighbors(X)

С выходом Индексов:

array([[0, 1, 5, 6, 4],
       [1, 2, 0, 6, 7],
       [2, 1, 7, 8, 6],
       [3, 4, 5, 0, 6],
       [4, 5, 3, 0, 6],
       [5, 6, 4, 0, 1],
       [6, 7, 5, 1, 2],
       [7, 8, 6, 2, 1],
       [8, 9, 7, 2, 6],
       [9, 8, 7, 2, 6]], dtype=int64)

Я могу l oop, хотя в dataframe и сравнивать все элементы, но его ресурс потребляет, так как у меня есть 1M строк. Любая помощь приветствуется.

1 Ответ

0 голосов
/ 14 марта 2020

IIU C, вы можете использовать indices, чтобы получить соответствующее значение в столбце Band1, затем использовать np.argmax с осью параметра, установленной в 1, чтобы получить положение самое высокое значение в строке. Если значение равно 0, то это означает, что Band1 этой строки выше, чем у соседей, например:

df['local_high'] = np.argmax(df['Band1'].to_numpy()[indices], axis=1)==0

, и вы получите

         lat        lon  crs   Band1              x          y  local_high
0  41.855584  20.619156  b''  1568.0  468388.198606  4633812.0       False
1  41.855584  20.622590  b''  1562.0  468673.173031  4633811.0       False
2  41.855584  20.626023  b''  1605.0  468958.147443  4633810.0        True
3  41.859017  20.612290  b''  1598.0  467819.970900  4634196.0       False
4  41.859017  20.615723  b''  1593.0  468104.930108  4634195.0       False
5  41.859017  20.619156  b''  1600.0  468389.889303  4634193.0        True
6  41.859017  20.622590  b''  1586.0  468674.848486  4634192.0       False
7  41.859017  20.626023  b''  1577.0  468959.807656  4634191.0       False
8  41.859017  20.629456  b''  1584.0  469244.766814  4634190.0       False
9  41.859017  20.632889  b''  1598.0  469529.725959  4634188.0       False
...