Как написать функцию, которая оценивает только первые n членов массива-подобного объекта и возвращает их сумму? - PullRequest
0 голосов
/ 23 октября 2018

Предположим, у меня есть массив следующим образом:

A = np.array([a,b,c,d,e,f])

Каждый элемент в массиве имеет значение, равное скаляру (например, возможно a равно 2, b равнодо 7 и т. д.).Но a и b требуют много времени для оценки, поэтому Python может потребовать пару минут, чтобы определить значение a, еще пару минут, чтобы определить значение b, и аналогично дляостальные элементы.

Если есть способ определить функцию (назовем ее sumfirstn), которая оценивает первые n членов A и вычисляет их сумму?Например, sumfirstn(A,2) вернет a+b, sumfirstn(A,3) вернет a+b+c и т. Д.

Но (и это важно) sumfirstn(A,2) должен не оценить c, d, e и f.Он должен только оценивать соответствующие термины, которые добавляются (чтобы сократить время вычислений).Конечно, A[0:n].sum() делает свое дело, но для этого нужно, чтобы Python вычислял весь массив A, что я не хочу делать!

Есть идеи?A не обязательно должен быть массивом, может быть списком, фреймом данных или быть в какой-либо другой форме ... что бы ни работало.

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Похоже, вам нужно общее решение для суммирования первых n элементов любой итераций , которые не обязательно должны поддерживать индексацию, нарезку или метод sum.

Если я правильно понимаю, в качестве универсального решения должно быть достаточно следующего:

>>> from itertools import islice
>>> 
>>> def first_n_sum(iterable, n):
...     return sum(islice(iterable, n))

Демонстрация:

>>> first_n_sum([1,2,3,4], 3)
6
>>> first_n_sum((x for x in (1, 2, 3, 4)), 2)
3
>>> first_n_sum([], 123)
0
>>> from collections import OrderedDict
>>> first_n_sum(OrderedDict([(1, 'a'), (2, 'b'), (-3, 'c'), (100, 'd')]), 3)
0

Обратите внимание, что не будет ошибки, если итерация не может произвести nзначения, так же как нарезка за пределы длины массива, это нормально.В этом случае будет возвращена сумма всех элементов.

0 голосов
/ 23 октября 2018

Предположим, что a, b, c, d, e, f являются функциями, которые мы можем сделать что-то вроде:

def func():
    return 1+2+3

def sumfirstn(arr_of_functions, n):
    return sum([arr_of_functions[i]() for i in range(n)])

A = np.array([func, func, func, func, func, func])
sumfirstn(A,2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...