Сократить несколько массивов на основе значений координат - PullRequest
0 голосов
/ 30 октября 2018

У меня 5 списков:

X = [0,1,2,3,4,0,1,2,3,6]
Y = [9,8,7,6,4,9,4,7,6,3]
R = [1,2,3,4,5,6,7,8,9,0]
P = [2,4,6,8,10,12,14,16,18,20]
Q = [1,3,5,7,9,11,13,15,17,19]

Учитывая дублирующиеся координаты, я хочу суммировать атрибуты, которые относятся к координатам, поэтому, например, X [0] = 0 и Y [0] = 9, эта точка повторяется в X [5] и Y [5], но с разными R, P, Q значения R [0]! = R [5] и т. Д.

Я пытаюсь создать список с уникальными координатами и суммированными значениями дубликатов координат, чтобы получить новые X, Y, R, P, Q, которые выглядят так:

X = [0,1,2,3,4,1,6]
Y = [9,8,7,6,4,4,3]
R = [7,2,11,13,5,7,0]
P = [14,4,22,26,10,14,20]
Q = [14,3,20,24,9,11,19]

Я не могу сформулировать эту проблему, любая помощь приветствуется!

Ответы [ 2 ]

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

Вот еще одно решение с использованием Numpy:

import numpy as np

X = np.array([0,1,2,3,4,0,1,2,3,6])
Y = np.array([9,8,7,6,4,9,4,7,6,3])
R = np.array([1,2,3,4,5,6,7,8,9,0])
P = np.array([2,4,6,8,10,12,14,16,18,20])
Q = np.array([1,3,5,7,9,11,13,15,17,19])


coords = np.array(list(zip(X,Y)), dtype=[('f0', '<i4'), ('f1', '<i4')])
unique_coords = np.unique(coords)

X_new = [x[0] for x in unique_coords]
Y_new = [y[1] for y in unique_coords]
R_new = [np.sum(R[coords == coo]) for coo in unique_coords]
P_new = [np.sum(P[coords == coo]) for coo in unique_coords]
Q_new = [np.sum(Q[coords == coo]) for coo in unique_coords]

print(X_new)
print(Y_new)
print(R_new)
print(P_new)
print(Q_new)

Выход:

[0, 1, 1, 2, 3, 4, 6]
[9, 4, 8, 7, 6, 4, 3]
[7, 7, 2, 11, 13, 5, 0]
[14, 14, 4, 22, 26, 10, 20]
[12, 13, 3, 20, 24, 9, 19]
0 голосов
/ 30 октября 2018

Если вы используете панд, это будет выглядеть так:

import pandas as pd

X = [0,1,2,3,4,0,1,2,3,6]
Y = [9,8,7,6,4,9,4,7,6,3]
R = [1,2,3,4,5,6,7,8,9,0]
P = [2,4,6,8,10,12,14,16,18,20]
Q = [1,3,5,7,9,11,13,15,17,19]

df = pd.DataFrame([X, Y, R, P, Q])
X, Y, R, P, Q = df.T.groupby([0,1]).sum().reset_index().T.values

Что даст:

[0 1 1 2 3 4 6]
[9 4 8 7 6 4 3]
[ 7  7  2 11 13  5  0]
[14 14  4 22 26 10 20]
[12 13  3 20 24  9 19]

Обратите внимание, что порядок не сохраняется, но числа совпадают.

...