Есть ли способ применить функцию на каждые два элемента? - PullRequest
0 голосов
/ 16 января 2020

Если у меня есть, например, два массива:

a = np.array([1,2,3,4,5,6,7])
b = np.array([1, 2])

Я хочу получить следующий результат:

c = np.array([a[0]*b[0] - a[1]*b[1],a[0]*b[1] - a[1]*b[2], so on, a[0]*b[n-2] - a[1]*b[n-1]])

Я заинтересован в методе numpy сверточного типа который может применить пользовательскую функцию к двум массивам. Я попытался свернуть:

np.convolve(a, b)

, но я не могу применить пользовательскую функцию, используя функцию свертки

Ответы [ 2 ]

1 голос
/ 16 января 2020

convolve подразумевает сумму, но вы можете вычесть ее, просто установив второй член отрицательным:

b_neg = b.copy()
np.negative.at(b_neg, 1)
# or just b_neg = np.array([1, -2])
out = np.convolve(a, b_neg, node = 'valid')

Тем не менее, если вы просто хотите использовать пользовательскую функцию, вам понадобится @mrks ответ

0 голосов
/ 16 января 2020

Похоже, вы ищете scipy.ndimage.generic_filter. Вы найдете do c здесь .

Пример:

import functools
from scipy.ndimage import generic_filter


def fun(input_chunk, coeffs):
    ... # calculate result
    return result

c = generic_filter(a, functools.partial(fun, coeffs=b), size=len(b))
...