Факел / numpy: групповой pandas альтернатива - PullRequest
0 голосов
/ 20 марта 2020

Есть ли какой-нибудь эффективный способ переписать следующий код, чтобы избежать установки и импорта pandas и использования взамен torch / numpy? Я привык работать с pandas, поэтому я написал это так, но я пытаюсь выучить numpy и torch, поэтому я ищу альтернативные решения, которые не используют pandas.

bins = torch.LongTensor(3072).random_(0, 35)
weights = torch.rand((3072))
df = pd.DataFrame({'weights': weights.numpy(), 'bins': bins.numpy()})
bins_sum = df.groupby('bins').weights.sum().values

Итак, в основном: как, без использования pandas, получить сумму weights, сгруппированную по bins?

Ответы [ 2 ]

0 голосов
/ 20 марта 2020

numpy имеет isin, что аналогично pandas.isin

Pandas groupby, выберите данные (row) и примените функцию к group.

def groupby(data, bin_data, grouper, agg):
  '''
    data:     numpy    array
    bin_data: bin's    data
    grouper:  callable, which give returns a list of array values.
    agg:      callable, to be applied on group
  '''

  res = {}
  for key,arr in grouper(data, bin_data):
    res.update({key, agg(arr)})

  return res

# Find the indices where `bins == b` and then use them to select the `arry` values
bin_grouper = lambda arry, bvalue: [(b, arry[np.isin(bvalue, b)]) for b in bvalue]

# Compute result
gdata = groupby(weights.numpy(), bins.numpy(), bin_grouper, np.sum)
0 голосов
/ 20 марта 2020

Вы можете вычислить уникальные элементы bins через torch.unique (значения для группировки), а затем использовать индексные маски для доступа к соответствующим элементам в weights:

unique = torch.unique(bins)
result = torch.zeros(unique.size(), dtype=weights.dtype)
for i, val in enumerate(unique):
    result[i] += weights[bins == val].sum()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...