Как сделать отдельные элементы нарезки массива? - PullRequest
2 голосов
/ 04 апреля 2019

Я собираюсь обработать пустой массив и сделать его в нужной форме.

Вот исходный массив:

a = np.array([
  [0, 1],
  [0, 2],
  [1, 1],
  [1, 2],
  [1, 3],
  [2, 1]
])

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

Объясните подробно: в первом столбце есть два элемента 0, три 1 и один 2.a.Первый столбец результата ret содержит элементы без повтора 0/1/2.В то же время, второй элемент столбца ret получает среднее значение или медиану [1, 2], когда индекс равен 0 в a, среднее значение или медиану [1,2,3], когда индекс равен 1 в a(забудьте их типы).

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

ret = np.array([
  [0, 1.5],
  [1, 2.0],
  [2, 1.0]
])

Извините, у меня естьбез понятия.Спасибо за ответы.

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

Это решение, использующее только NumPy:

import numpy as np

a = np.array([
  [0, 1],
  [0, 2],
  [1, 1],
  [1, 2],
  [1, 3],
  [2, 1]
])

group = a[:, 0]
values = a[:, 1]
# Take unique group ids
group_ids, group_idx, group_counts = np.unique(group, return_inverse=True,
                                               return_counts=True)
# Compute sum of group values
group_adds = np.zeros(len(group_ids))
np.add.at(group_adds, group_idx, values)
# Compute means
group_means = group_adds / group_counts
# Compose result
result = np.stack([group_ids, group_means], axis=1)
print(result)
# [[0.  1.5]
#  [1.  2. ]
#  [2.  1. ]]

Обратите внимание, что result - это массив с типом float. Если вы хотите сохранить идентификатор группы как целое число, вы можете просто сохранить group_ids и group_means как отдельные массивы или объединить их в структурированный массив :

result_struct = np.empty(len(group_ids), dtype=[('id', 'i4'), ('mean', 'f8')])
result_struct['id'] = group_ids
result_struct['mean'] = group_means
print(result_struct)
# [(0, 1.5) (1, 2. ) (2, 1. )]
1 голос
/ 04 апреля 2019

Вы можете преобразовать ваш массив в кадр данных pandas, а затем использовать groupby.

import pandas as pd
import numpy as np

a = np.array([
    [0, 1],
    [0, 2],
    [1, 1],
    [1, 2],
    [1, 3],
    [2, 1]])

a=pd.DataFrame(a)
a=a.groupby(0).mean()

Обратите внимание, что мы группируем по "0", так как мы не присваивали никаких имен нашим переменным, и в вашем вопросе выскажем, что первый столбец - это тот, по которому вы хотите сгруппироваться.

Наконец, если вы хотите преобразовать обратно в простой массив, вы можете сделать:

a=a.values
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...