NumPy векторизовать функцию, чтобы принимать векторы различной длины и возвращать тензорный результат - PullRequest
0 голосов
/ 15 мая 2018

Я хочу векторизовать функцию f(a, b), чтобы при вводе a и b в качестве двух векторов возвращался тензор комбинаций.Вот иллюстративный пример:

import numpy as np
def tester(a, b):
   mysumm = 0.
   for ii in range(a):
       for jj in range(b):
           mysumm += a * b
   return mysumm
tester = np.vectorize(tester)
x, y = [2, 4], [3, 5, 8] 
print(tester(x, 3)) # [ 36. 144.]
print(tester(x, 5)) # [100. 400.]
print(tester(x, 8)) # [ 256. 1024.]
print(tester(2, y)) # [ 36. 100. 256.]
print(tester(4, y)) # [ 144.  400. 1024.]
print(tester(x, y)) # ValueError: operands could not be broadcast together with shapes (2,) (3,) 

Я ожидал, что вызов tester(x, y) вернет матрицу 2x3, что-то вроде [[ 36. 100. 256.], [ 144. 400. 1024.]], и я был удивлен, что это не поведение по умолчанию.

Как сделать так, чтобы векторизованная функция возвращала тензор возможных комбинаций входных векторов?

1 Ответ

0 голосов
/ 15 мая 2018

Вы можете связать с np.ix_:

>>> import functools
>>> 
>>> def tensorize(f):
...     fv = np.vectorize(f)
...     @functools.wraps(f)
...     def ft(*args):
...         return fv(*np.ix_(*map(np.ravel, args)))
...     return ft
... 
>>> tester = tensorize(tester)
>>> tester(np.arange(3), np.arange(2))
array([[0., 0.],
       [0., 1.],
       [0., 4.]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...