Numpy объединение значений в двумерном массиве на основе индекса - PullRequest
0 голосов
/ 07 мая 2018

У меня есть массив numpy, основанный на этом формате [[x,y],[x,y]...], и с этим я хотел бы объединить значения y, где x одинаковы

Пример array = [[0,0],[1,1],[2,4],[4,6],[2,2],[3,7],[1,9],[4,16],[5,1],[5,2],[0,0]]

Я бы хотел, чтобы это стало newArray = [[0,0],[1,10],[2,6],[3,7],[4,22],[5,3]] - его не нужно заказывать

Как будто теперь я не могу придумать способ сделать это просто и эффективно, это может помочь добавить в мой фактический массив использование меток времени в качестве моего значения x, такого как Timestamp('2018-05-05 00:00:00'), и имеет размер 183083, который не не так уж плохо.

Любая помощь ценится!

Ответы [ 3 ]

0 голосов
/ 07 мая 2018

Это типичная операция группировки. numoy не поддерживает их полностью из коробки, но пакет с индексом numy-indexed поддерживает (заявление об отказе: я его автор):

import numpy_indexed as npi
keys, sums = npi.group_by(A[:, 0]).sum(A[:, 1])

Это решение работает полностью векторизованным образом; так что нет для циклов по массиву в Python, а также обобщает для многих других сценариев. Может быть установлен с помощью pip или conda.

0 голосов
/ 07 мая 2018

Вот пример использования collections.Counter

import numpy as np
from collections import Counter

ar = np.array([[0,0],[1,1],[2,4],[4,6],[2,2],[3,7],[1,9],[4,16],[5,1],[5,2],[0,0], [20,0]])

repeated = [item for item, count in Counter(ar[:,0]).iteritems() if count > 1]
non_repeated = [item for item in range(len(ar)) if item not in repeated]

new_arr = []
for element in repeated:
    new_arr.append(np.sum(ar[np.where(ar[:,0]==element)],axis=0))
new_arr = np.asanyarray(new_arr)
new_arr[:,0] = new_arr[:,0]/2.
new_arr = ar[non_repeated]
0 голосов
/ 07 мая 2018

Чистые numpy решения доступны, если производительность является проблемой: Суммируйте массив по числу в numpy

Ниже приведен словарный подход с использованием collections.defaultdict. Это работает путем итерации каждой строки в вашем массиве и суммирования значений по ключу.

import numpy as np
from collections import defaultdict

A = np.array([[0,0],[1,1],[2,4],[4,6],[2,2],[3,7],[1,9],[4,16],[5,1],[5,2],[0,0]])

d = defaultdict(int)
for i, j in A:
    d[i] += j

res = np.array(sorted(d.items()))

print(res)

array([[ 0,  0],
       [ 1, 10],
       [ 2,  6],
       [ 3,  7],
       [ 4, 22],
       [ 5,  3]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...