Numpy получить максимальное значение на основе XYZ - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь прочитать CSV-файл с некоторыми данными XYZ, но когда сетка с использованием Python Natgrid вызывает ошибку: two input triples have the same x/y coordinates. Вот мой массив:

np.array([[41.540588, -100.348335, 0.052785],
   [41.540588, -100.348335, 0.053798],
   [42.540588, -102.348335, 0.021798],
   [42.540588, -102.348335, 0.022798],
   [43.540588, -103.348335, 0.031798]])

Я хочу удалить дубликаты XY и получить максимальное значение Z. Основываясь на примере выше, я хочу удалить любые минимальные значения этого массива:

np.array([[41.540588, -100.348335, 0.053798],
   [42.540588, -102.348335, 0.022798],
   [43.540588, -103.348335, 0.031798]])

Я пытался использовать np.unique, но пока мне не повезло, потому что он не работает со строками (только столбцы).

Ответы [ 3 ]

0 голосов
/ 14 ноября 2018

Вы можете использовать Панд через сортировку и удаление дубликатов:

import pandas as pd

df = pd.DataFrame(arr)

res = df.sort_values(2, ascending=False)\
        .drop_duplicates([0, 1])\
        .sort_values(0).values

print(res)

array([[  4.15405880e+01,  -1.00348335e+02,   5.37980000e-02],
       [  4.25405880e+01,  -1.02348335e+02,   2.27980000e-02],
       [  4.35405880e+01,  -1.03348335e+02,   3.17980000e-02]])
0 голосов
/ 14 ноября 2018

Вот способ numpy, сначала сортировка по Z, затем поиск первой каждой уникальной пары X и Y и индексация:

a = np.array([[41.540588, -100.348335, 0.052785],
   [41.540588, -100.348335, 0.053798],
   [42.540588, -102.348335, 0.021798],
   [42.540588, -102.348335, 0.022798],
   [43.540588, -103.348335, 0.031798]])

# sort by Z
b = a[np.argsort(a[:,2])[::-1]]
# get first index for each unique x,y pair
u = np.unique(b[:,:2],return_index=True,axis=0)[1]
# index
c = b[u]
>>> c
array([[ 4.15405880e+01, -1.00348335e+02,  5.37980000e-02],
       [ 4.25405880e+01, -1.02348335e+02,  2.27980000e-02],
       [ 4.35405880e+01, -1.03348335e+02,  3.17980000e-02]])
0 голосов
/ 14 ноября 2018

Если вы можете использовать pandas, вы можете воспользоваться groupby и max

>>> pandas.DataFrame(arr).groupby([0,1], as_index=False).max().values

array([[ 4.15405880e+01, -1.00348335e+02,  5.37980000e-02],
       [ 4.25405880e+01, -1.02348335e+02,  2.27980000e-02],
       [ 4.35405880e+01, -1.03348335e+02,  3.17980000e-02]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...