объединять и объединять данные из структурированного массива NumPy в другой - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть пустой структурированный массив:

id_and_orders_type = np.dtype([('id', 'i4'), ('order_values', 'f4', (100,))])
id_and_orders = np.zeros((10,), dtype=id_and_orders_type)

, и у меня есть еще один структурированный массив с данными, которые нужно заполнить в id_and_orders.

orders_type = np.dtype([('id', 'i4'), ('value', 'f4')])
orders = np.array(((1, 33.2), (2, 37.1), (3, 22.1), (2, 63.9), (3, 93.1)), dtype=orders_type)

чтоЯ хочу сделать сейчас, чтобы сопоставить каждый orders['value'] с соответствующими id в id_and_orders.Таким образом, id_and_orders будет содержать orders['id'] с подмассивом значений для этого идентификатора в orders:

id_and_orders = np.array(((1, (33.2,), (2, (37.1, 63.9), (3, (22.1, 93.1)))

и, возможно, некоторые будут знать, как построить размер подмассива id_and_orders['order_values'] динамически и не фиксированный размер с 100.

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Это то, что я написал бы, используя структуры данных python, и рассмотрел бы вопрос о преобразовании некоторых структур данных в numpy только в том случае, если производительность становится проблемой. Numpy обеспечивает быстрый доступ к элементам одинакового типа (и формы для многомерных данных). Если данные не совсем совпадают с этим форматом, рекомендуется включить list с и dict с.

Вместо массива, просто используйте список для ввода:

id_orders = [(1, 33.2), (2, 37.1), (3, 22.1), (2, 63.9), (3, 93.1)]

Затем создайте dict ордеров по идентификатору, причем каждый ключ содержит список значений, принадлежащих этому ключу.

orders = {}
for id, val in id_orders:
    orders.setdefault(id, []).append(val)

Использование setdefault возвращает текущее значение для ключа, если ключ присутствует.
Если это не так, он устанавливает ключ как пустой список и возвращает его. После инициализации orders достаточно просто преобразовать каждую запись в массив numpy. Сделайте этот шаг последним, поскольку массивы numpy не очень хорошо справляются с изменениями размера.

orders = {k:array(v) for k, v in orders.items()} 
0 голосов
/ 14 сентября 2018

Я рекомендую вместо этого использовать DataFrame Pandas:

df=pd.DataFrame(
    [(1, 33.2), (2, 37.1), (3, 22.1), (2, 63.9), (3, 93.1)],
    columns=['type', 'value']
)
#    type  value
# 0     1   33.2
# 1     2   37.1
# 2     3   22.1
# 3     2   63.9
# 4     3   93.1

, что позволяет легко группировать по type, например, взять сумму value с

df.groupby('type').sum()
#       value
# type       
# 1      33.2
# 2     101.0
# 3     115.2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...