Как объединить несколько массивов NumPy в список словаря - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть следующий массив:

column_names = ['id', 'temperature', 'price']

И три numpy массива следующим образом:

idArry = ([1,2,3,4,....])

tempArry = ([20.3,30.4,50.4,.....])

priceArry = ([1.2,3.5,2.3,.....])

Я хотел объединить вышеперечисленное в словарь следующим образом:

table_dict = ( {'id':1, 'temperature':20.3, 'price':1.2 },
               {'id':2, 'temperature':30.4, 'price':3.5},...)

Я могу использовать цикл for вместе с append для создания словаря, но список огромен и составляет около 15000 строк.Может кто-нибудь показать мне, как использовать функциональность python zip или другой, более эффективный и быстрый способ выполнения вышеуказанного требования?

Ответы [ 6 ]

0 голосов
/ 09 февраля 2019

Способ сделать это будет следующим:

column_names = ['id', 'temperature', 'price']

idArry = ([1,2,3,4])
tempArry = ([20.3,30.4,50.4, 4])
priceArry = ([1.2,3.5,2.3, 4.5])

Вы можете zip все элементы в другом списке:

l = zip(idArry,tempArry,priceArry)

print(list(l))
[(1, 20.3, 1.2), (2, 30.4, 3.5), (3, 50.4, 2.3), (4, 4, 4.5)]

И добавить внутренние словари ксоставьте список с использованием списка и перебирая элементы в l следующим образом:

[dict(zip(column_names, next(l))) for i in range(len(idArry))]

[{'id': 1, 'temperature': 20.3, 'price': 1.2},
 {'id': 2, 'temperature': 30.4, 'price': 3.5},
 {'id': 3, 'temperature': 50.4, 'price': 2.3},
 {'id': 4, 'temperature': 4, 'price': 4.5}]

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

0 голосов
/ 09 февраля 2019

Вы можете построить матрицу NumPy, а затем преобразовать в словарь следующим образом.Учитывая ваши данные (я изменил значения только для примера):

import numpy as np

idArry = np.array([1,2,3,4])
tempArry = np.array([20,30,50,40])
priceArry = np.array([200,300,100,400])

Построить матрицу:

table = np.array([idArry, tempArry, priceArry]).transpose()

Создать словарь:

dict_table = [ dict(zip(column_names, values)) for values in table ]
#=> [{'id': 2, 'temperature': 30, 'price': 300}, {'id': 3, 'temperature': 50, 'price': 100}, {'id': 4, 'temperature': 40, 'price': 400}]


Я не знаю цели, но, возможно, вы также можете использовать матрицу следующим образом.
temp_col = table[:,1]

table[temp_col >= 40]
# [[  3  50 100]
#  [  4  40 400]]
0 голосов
/ 09 февраля 2019

Вы можете использовать списки для достижения этого, просто перебирая один из массивов:

[{'id': idArry[i], 'temperature': tempArry[i], 'price': priceArry[i]} for i in range(len(idArry))]
0 голосов
/ 09 февраля 2019

Я бы посмотрел на функциональность пакета pandas.В частности, существует метод pandas.DataFrame.to_dict.

Я уверен, что для больших массивов этот метод должен быть довольно быстрым (хотя я хочу, чтобы метод zip оказался более эффективным).

В приведенном ниже примере я сначала создаю фрейм данных pandas из ваших массивов, а затем использую метод to_dict.

import numpy as np
import pandas as pd

column_names = ['id', 'temperature', 'price']

idArry = np.array([1, 2, 3])
tempArry = np.array([20.3, 30.4, 50.4])
priceArry = np.array([1.2, 3.5, 2.3])

df = pd.DataFrame(np.vstack([idArry, tempArry, priceArry]).T, columns=column_names)

table_dict = df.to_dict(orient='records')
0 голосов
/ 09 февраля 2019

Это может сработать.Enumerate используется для создания счетчика, который начинается с 0, а затем каждое применимое значение извлекается из ваших tempArry и priceArray.Это также создает выражение генератора, которое помогает с памятью (особенно если ваши списки действительно большие).

new_dict = ({'id': i + 1 , 'temperature': tempArry[i], 'price': priceArry[i]} for i, _ in enumerate(idArry))
0 голосов
/ 09 февраля 2019

Вы можете использовать listcomp и функцию zip():

[{'id': i, 'temperature': j, 'price': k} for i, j, k in zip(idArry, tempArry, priceArry)]
# [{'id': 1, 'temperature': 20.3, 'price': 1.2}, {'id': 2, 'temperature': 30.4, 'price': 3.5}]

Если ваши идентификаторы 1, 2, 3 ... и вы используете список, вам не нужны идентификаторы в ваших комментариях,Это избыточная информация в списке.

[{'temperature': i, 'price': j} for i, j in zip(tempArry, priceArry)]

Вы также можете использовать диктовку.Поиск в dict должен быть быстрее, чем в списке.

{i: {'temperature': j, 'price': k} for i, j, k in zip(idArry, tempArry, priceArry)}
# {1: {'temperature': 20.3, 'price': 1.2}, 2: {'temperature': 30.4, 'price': 3.5}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...