Numpy сортировать строки в массиве 4d и суммировать одинаковые значения - PullRequest
0 голосов
/ 16 октября 2018

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

4.9 6.14923e-01 -4.7827e-01 -6.8341e+00
1.2 -4.7827e-01 -3.4162e-01 -7.9249e+00
3.4 -4.7827e-01 -6.1492e-01 -6.8341e+00
6.8 -4.7827e-01 -4.7827e-01 -7.4221e+00
5.2 6.14923e-01 -4.7827e-01 -6.8341e+00
1.4 -4.7827e-01 -3.4162e-01 -7.9249e+00
2.6 -4.7827e-01 -3.4162e-01 -6.9302e+00
2.8 -4.7827e-01 -6.1492e-01 -6.8341e+00
5.6 -4.7827e-01 -3.4162e-01 -6.9302e+00
4.1 -4.7827e-01 -4.7827e-01 -7.4221e+00
2.2 -4.7827e-01 -3.4162e-01 -6.9302e+00

Три последних столбца - это координаты (x, y, z).

Поэтому я хочу суммировать для каждого значения повторенияox x, y и z значение в первом столбце.

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

2.8 -4.7827e-01 -6.1492e-01 -6.8341e+00
3.4 -4.7827e-01 -6.1492e-01 -6.8341e+00
6.8 -4.7827e-01 -4.7827e-01 -7.4221e+00
4.1 -4.7827e-01 -4.7827e-01 -7.4221e+00
1.2 -4.7827e-01 -3.4162e-01 -7.9249e+00
1.4 -4.7827e-01 -3.4162e-01 -7.9249e+00
2.6 -4.7827e-01 -3.4162e-01 -6.9302e+00
5.6 -4.7827e-01 -3.4162e-01 -6.9302e+00
2.2 -4.7827e-01 -3.4162e-01 -6.9302e+00
5.2 6.14923e-01 -4.7827e-01 -6.8341e+00
4.9 6.14923e-01 -4.7827e-01 -6.8341e+00

и после суммирования первого столбца для каждого уникального значения

6.2  -4.7827e-01 -6.1492e-01 -6.8341e+00
10.9 -4.7827e-01 -4.7827e-01 -7.4221e+00
2.6  -4.7827e-01 -3.4162e-01 -7.9249e+00
10.4 -4.7827e-01 -3.4162e-01 -6.9302e+00
10.1 6.14923e-01 -4.7827e-01 -6.8341e+00

Ответы [ 3 ]

0 голосов
/ 16 октября 2018
import numpy as np
import pandas as pd
a=[[4.9, 6.14923e-01, -4.7827e-01, -6.8341e+00],
[1.2, -4.7827e-01, -3.4162e-01 ,-7.9249e+00],
[3.4, -4.7827e-01, -6.1492e-01, -6.8341e+00],
[6.8, -4.7827e-01, -4.7827e-01, -7.4221e+00],
[5.2, 6.14923e-01, -4.7827e-01, -6.8341e+00],
[1.4, -4.7827e-01, -3.4162e-01, -7.9249e+00],
[2.6, -4.7827e-01, -3.4162e-01, -6.9302e+00],
[2.8, -4.7827e-01, -6.1492e-01, -6.8341e+00],
[5.6, -4.7827e-01, -3.4162e-01, -6.9302e+00],
[4.1, -4.7827e-01, -4.7827e-01, -7.4221e+00],
[2.2, -4.7827e-01, -3.4162e-01, -6.9302e+00]]
a=np.array(a)
df=pd.DataFrame(a)
df['sum']=df.groupby([1,2,3])[0].transform('sum')
df.drop_duplicates(subset=[1,2,3])[[1,2,3,'sum']]
0 голосов
/ 16 октября 2018

Вы можете достичь groupby -подобного поведения, используя scipy.sparse.csr_matrix.Тем не менее, это требует некоторой работы, потому что sparse не будет хорошо работать с тремя столбцами, которые вы хотите сгруппировать.

Однако мы можем использовать np.unique, чтобы вернуть уникальные значения, а также обратные, поэтомучто мы можем превратить три столбца в массив 1D, сохраняя при этом несколько столбцов для повторного добавления в конце:


from scipy import sparse

v, bins = np.unique(a[:, 1:], axis=0, return_inverse=True)
vals = a[:, 0]

out = sparse.csr_matrix(
    (vals, bins, np.arange(vals.shape[0]+1)), (vals.shape[0], bins.max()+1)
).sum(0).A1

np.column_stack((out, v))

array([[ 6.2     , -0.47827 , -0.61492 , -6.8341  ],
       [10.9     , -0.47827 , -0.47827 , -7.4221  ],
       [ 2.6     , -0.47827 , -0.34162 , -7.9249  ],
       [10.4     , -0.47827 , -0.34162 , -6.9302  ],
       [10.1     ,  0.614923, -0.47827 , -6.8341  ]])
0 голосов
/ 16 октября 2018

Этот тип проблемы очень легко решается с помощью pandas, и он требует больше кода, если вам нужно решение на чистом Python или numpy.Я бы предложил:

import pandas as pd

df = pd.DataFrame(arr, columns=['A','X','Y','Z'])

new_df = df.groupby(['X','Y','Z'],as_index=False).sum()

new_arr = new_df[['A','X','Y','Z']].values

>>> new_arr
array([[ 6.2     , -0.47827 , -0.61492 , -6.8341  ],
       [10.9     , -0.47827 , -0.47827 , -7.4221  ],
       [ 2.6     , -0.47827 , -0.34162 , -7.9249  ],
       [10.4     , -0.47827 , -0.34162 , -6.9302  ],
       [10.1     ,  0.614923, -0.47827 , -6.8341  ]])

# All in one line, without saving intermediate steps to memory:

# new_arr pd.DataFrame(arr).groupby([1,2,3],as_index=False).sum()[[0,1,2,3]].values
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...