В MessageBag
есть метод keys()
, с помощью которого вы получаете все MessageBag
ключей, для получения дополнительной информации о методах, которые вы можете использовать с классом MessageBag
, пожалуйста, проверьте MessageBag laravel api doc
Вы не должны создавать массивы numpy для вызова numpy.std (). Можно назвать numpy.std () в цикле по всем значениям словаря. Список будет преобразован в массив numpy на лету для вычислений стандартного изменения.
Оборотная сторона этого метода - то, что основной цикл будет в Python а не в C. Но я предполагаю, что это должно быть достаточно быстро: Вы все еще вычислите станд. на скорости C, и Вы сохраните большую память, поскольку Вы не должны будете хранить 0 значений, где у Вас есть переменные массивы размера.
пример с 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)
В то время как уже существует некоторый довольно разумный подарок идей здесь, я полагаю, что следующее стоит упомянуть.
Заполнение недостающих данных с любым значением по умолчанию испортило бы статистические характеристики (станд., и т.д.). Очевидно вот почему Mapad предложил хороший прием с группировкой тех же размерных записей. Проблема с ними (принимающий нет никаких априорных данных по длинам записей, под рукой), то, что они включают еще больше вычислений, чем простое решение:
Используя 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)