Применить массив функций к другому массиву - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть массив numpy функций, и я хотел бы применить к массиву с плавающей точкой, используя правила вещания numpy. Помимо использования для l oop, есть ли какой-нибудь стандартный способ добиться этого?

funcs = np.array([f1, f2, f3]) # each f is of type f(x: float) -> float
data = np.array([[1,2,3],
                 [4,5,6]])

# Expected result
np.array([[f1(1),f2(2),f3(3)],
          [f1(4),f2(5),f3(6)]])

Edit

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

>>> np.array([0,1]) + 1
np.array([0+1, 1+1])

>>> np.array([0,1]) + np.array([1,2])
np.array([0+1, 1+2])

>>> np.array([0,1]) + np.array([[1,2], [3,4]])
np.array([[0+1, 1+2], [0+3, 1+4]])

## Expected behaviour (Imagine % means function application operator)
>>> np.array([0,1]) % f
np.array([f(0), f(1)])

>>> np.array([0,1]) % np.array([f1,f2])
np.array([f1(0), f2(1)])

>>> np.array([0,1]) % np.array([[f1,f2], [f3,f4]])
np.array([[f1(0), f2(1)], [f3(0), f4(1)]])

Ответы [ 3 ]

1 голос
/ 28 февраля 2020

Использование frompyfunc

f = np.frompyfunc(lambda fx,arg: fx(arg), 2, 1)
res = f(fns, arg)

Результатом должен быть объект типа d, с полной трансляцией.

In [416]: f = np.frompyfunc(lambda fn,x:fn(x),2,1)                                             
In [420]: f1=lambda x:x+1 
     ...: f2=lambda x: x*3                                                                     
In [421]: f([[f1],[f2]], np.arange(4))                                                         
Out[421]: 
array([[1, 2, 3, 4],
       [0, 3, 6, 9]], dtype=object)
0 голосов
/ 28 февраля 2020

Если функции могут принимать массив numpy, я бы использовал 2 транспонирования:

resul = np.transpose(np.array([f[i](x[i]) for i, x in enumerate(np.transpose(data)]))
0 голосов
/ 28 февраля 2020

Используя понимание, вы можете go для:

import numpy as np

def f1(input):
    return input + 1

def f2(input):
    return input + 2

def f3(input):
    return input + 3

funcs = np.array([f1, f2, f3])
data = np.array([[1,2,3],
                 [4,5,6]])

result = np.array(
    [[fun(item) for fun, item in zip(funcs, lst)]
    for lst in data])

print(result)

Что дает

[[2 4 6]
 [5 7 9]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...