Лучший способ создать массив NumPy из словаря?

В MessageBag есть метод keys(), с помощью которого вы получаете все MessageBag ключей, для получения дополнительной информации о методах, которые вы можете использовать с классом MessageBag, пожалуйста, проверьте MessageBag laravel api doc

8
задан Parand 2 March 2009 в 23:38
поделиться

2 ответа

Вы не должны создавать массивы numpy для вызова numpy.std (). Можно назвать numpy.std () в цикле по всем значениям словаря. Список будет преобразован в массив numpy на лету для вычислений стандартного изменения.

Оборотная сторона этого метода - то, что основной цикл будет в Python а не в C. Но я предполагаю, что это должно быть достаточно быстро: Вы все еще вычислите станд. на скорости C, и Вы сохраните большую память, поскольку Вы не должны будете хранить 0 значений, где у Вас есть переменные массивы размера.

  • Если Вы хотите далее оптимизировать это, можно сохранить значения в список массивов numpy, так, чтобы Вы сделали список Python-> numpy преобразование массива только однажды.
  • если Вы находите, что это все еще слишком медленно, попытайтесь использовать психо для оптимизации цикла Python.
  • если это все еще слишком медленно, попытайтесь использовать Cython вместе с numpy модулем. Это Учебное руководство требует впечатляющих улучшений скорости обработку изображений. Или просто программируйте целую функцию станд. в Cython (см. это для сравнительных тестов и примеров с функцией суммы),
  • Альтернатива Cython должна была бы использовать БОЛЬШОЙ ГЛОТОК с numpy.i.
  • если Вы хотите использовать только numpy и вычислить все на уровне C, попытайтесь собрать в группу все записи того же размера в различных массивах и назовите numpy.std () на каждом из них. Это должно быть похожим на следующий пример.

пример с O (N) сложность:

import numpy
list_size_1 = []
list_size_2 = []
for row in data.itervalues():
    if len(row) == 1:
      list_size_1.append(row)
    elif len(row) == 2:
      list_size_2.append(row)
list_size_1 = numpy.array(list_size_1)
list_size_2 = numpy.array(list_size_2)
std_1 = numpy.std(list_size_1, axis = 1)
std_2 = numpy.std(list_size_2, axis = 1)
8
ответ дан 5 December 2019 в 17:41
поделиться

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

Заполнение недостающих данных с любым значением по умолчанию испортило бы статистические характеристики (станд., и т.д.). Очевидно вот почему Mapad предложил хороший прием с группировкой тех же размерных записей. Проблема с ними (принимающий нет никаких априорных данных по длинам записей, под рукой), то, что они включают еще больше вычислений, чем простое решение:

  1. по крайней мере, O (N*logN) 'len' вызовы и сравнения для сортировки с эффективным алгоритмом
  2. O (N) проверяет второй путь через список для получения групп (их начало и индексы конца на 'вертикальной' оси)

Используя Psyco хорошая идея (это поразительно просто в использовании, так убедиться дать ему попытку).

Кажется, что оптимальный путь состоит в том, чтобы взять стратегию, описанную Mapad в маркере № 1, но с модификацией - для не генерации целого списка, но выполнить итерации через словарь, преобразовывающий каждую строку в numpy.array и выполняющий требуемые вычисления. Как это:

for row in data.itervalues():
    np_row = numpy.array(row)    
    this_row_std = numpy.std(np_row)
    # compute any other statistic descriptors needed and then save to some list

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


Обобщенный вариант того, что было предложено Mapad:

from numpy import array, mean, std

def get_statistical_descriptors(a):
    if ax = len(shape(a))-1
    functions = [mean, std]
    return f(a, axis = ax) for f in functions


def process_long_list_stats(data):
    import numpy

    groups = {}

    for key, row in data.iteritems():
        size = len(row)
        try:
            groups[size].append(key)
        except KeyError:
            groups[size] = ([key])

    results = []

    for gr_keys in groups.itervalues():             
        gr_rows = numpy.array([data[k] for k in gr_keys])       
        stats = get_statistical_descriptors(gr_rows)                
        results.extend( zip(gr_keys, zip(*stats)) )

    return dict(results)
2
ответ дан 5 December 2019 в 17:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: