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

У меня есть двумерный массив NumPy в Python:

[[ 1  2  1  3  3]
 [10 20 30 40 60]]

Я хотел бы иметь уникальные значения в первой строке и , добавляя соответствующие значения во второй строке вместе перед удалением столбцов. Итак, вывод для моего массива будет такой:

[[  1   2   3 ]
 [ 40  20 100 ]]

Я новичок в Python, и я не могу придумать эффективный способ сделать это для больших масштабов.

Ответы [ 4 ]

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

Вы можете использовать sparse.csr_matrix:

from scipy import sparse
b = a[0]
v = a[1]
m = b.max() + 1
s = v.shape[0]

res = sparse.csr_matrix((v, b, np.arange(s+1)), (s, m)).sum(0)

matrix([[  0,  40,  20, 100]], dtype=int32)

В этом случае показана сумма каждого значения из 0-a[0].max(), поэтому, чтобы связать его с вашим первоначальным результатом:

t = np.unique(a[0])
np.stack((t, res.A1[t]))

array([[  1,   2,   3],
       [ 40,  20, 100]])
0 голосов
/ 30 октября 2018

Не думаю, что вы станете намного эффективнее, чем использование словаря для подсчета и последующего создания массива из этого:

from collections import defaultdict
import numpy

sums = defaultdict(float)

arr = numpy.array([[ 1,  2,  1,  3,  3],
                   [10, 20, 30, 40, 60]]

for key, value in zip(*arr):
    sums[key] += value


numpy.array(list(sums.items())).T

возвращает

array([[  1.,   2.,   3.],
       [ 40.,  20., 100.]])
0 голосов
/ 30 октября 2018

К сожалению, numpy не имеет встроенной функции групповой работы (хотя есть способы их записи ). Если вы открыты для использования pandas, это будет просто:

import pandas as pd

>>> pd.DataFrame(a.T).groupby(0,as_index=False).sum().values.T

array([[  1,   2,   3],
       [ 40,  20, 100]])
0 голосов
/ 30 октября 2018
a = np.array([[ 1,  2,  1,  3,  3],
              [10, 20, 30, 40, 60]])

unique_values = np.unique(a[0])
new_array = np.zeros((2, len(unique_values)))
for i, uniq in enumerate(np.unique(a[0])):

    new_array[0][i] = uniq
    new_array[1][i] = np.where(a[0]==uniq,a[1],0).sum()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...