2016-06-30 4 views
2

Я работаю с очень большим набором данных (около 75 миллионов записей), и я пытаюсь сократить время, в течение которого мой код занимает значительный запас (с петлей прямо сейчас это займет пару дней) и сохранить использование памяти чрезвычайно низким.Все индексы каждого уникального элемента в списке python

У меня есть два массива numpy (clients и units) такой же длины. Моя цель - получить список каждого индекса, который имеет значение в моем первом списке (clients), а затем найти сумму записей в моем втором списке по каждому из этих индексов.

Это то, что я попытался (np это ранее импортированные NumPy библиотека)

# create a list of each value that appears in clients 
unq = np.unique(clients) 
arr = np.zeros(len(unq)) 
tmp = np.arange(len(clients)) 
# for each unique value i in clients 
for i in range(len(unq)) : 
    #create a list inds of all the indices that i occurs in clients 
    inds = tmp[clients==unq[i]] 
    # add the sum of all the elements in units at the indices inds to a list 
    arr[i] = sum(units[inds]) 

Кто-нибудь знает способ, который позволит мне найти эти суммы без пробегаем по каждому элементу в unq?

+0

Может ли панда быть вариантом для вас? – Cleb

+1

Панды - это всегда вариант. – m02ph3u5

+0

Я использую pandas для загрузки и загрузки массивов, есть ли другой способ, которым я мог бы его использовать? – Lynnsey

ответ

1

С Pandas, это легко можно сделать с помощью grouby() функции:

import pandas as pd 

# some fake data 
df = pd.DataFrame({'clients': ['a', 'b', 'a', 'a'], 'units': [1, 1, 1, 1]}) 

print df.groupby(['clients'], sort=False).sum() 

, который дает желаемый результат:

  units 
clients  
a   3 
b   1 

я использую вариант sort=False, поскольку это может привести к скорости -up (по умолчанию записи будут отсортированы, что может занять некоторое время для огромных datsets).

+1

Большое вам спасибо! Отлично! – Lynnsey

+0

@downvoter: Не могли бы вы объяснить свое нижестоящее? Это потому, что это бесчисленное число, а не вопрос панды? Тогда вы можете проверить комментарии ниже вопроса, на котором я спросил, будет ли панда вариантом ... Если что-то еще не так, укажите это! – Cleb

1

Это типичная групповая операция типа, которые могут быть выполнены элегантно и эффективно используя numpy-indexed пакет (Ограничение: Я являюсь его автором):

import numpy_indexed as npi 
unique_clients, units_per_client = npi.group_by(clients).sum(units) 

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

+0

Интересно. Никогда не слышал об этом пакете. Любые идеи, как это масштабируется для решения pandas, которое я добавил выше? По-видимому, кому-то это не очень нравится, но предпочитает ваше решение, поэтому я задаюсь вопросом, действительно ли у вас намного эффективнее ... :) – Cleb

+0

Я бы предположил, что они схожи с точки зрения производительности. Однако панды представляют собой тяжелую зависимость, концептуально говоря, для такой элементарной операции. Поскольку кто-то читает решение pandas, я могу задаться вопросом, что такое dataframe и что он должен делать с группировкой; и ответ по существу «ничто». –

Смежные вопросы