Как сделать так, чтобы ufunc выводил матрицу с двумя операндами типа array_like (вместо того, чтобы пытаться их транслировать)? - PullRequest
0 голосов
/ 07 октября 2018

Я хотел бы получить матрицу значений, заданных двумя ndarray из ufunc, например:

degs = numpy.array(range(5))
pnts = numpy.array([0.0, 0.1, 0.2])
values = scipy.special.eval_chebyt(degs, pnts)

Приведенный выше код не работает (он дает ValueError потому что он пытается транслировать два массива и терпит неудачу, поскольку они имеют разные формы: (5,) и (3,));Я хотел бы получить матрицу значений со строками, соответствующими градусам, и столбцами для точек, в которых оцениваются полиномы (или наоборот, это не имеет значения).

В настоящее время мой обходной путь заключается в простом использовании for -loop:

values = numpy.zeros((5,3))
for j in range(5):
    values[j] = scipy.special.eval_chebyt(j, pnts)

Есть ли способ сделать это?В общем, как вы могли бы сообщить ufunc, что вам нужен n -мерный массив, если у вас есть n аргументы в виде массива?

Я знаю о numpy.vectorize, но это кажется ни быстрее, ни большеэлегантнее, чем простой for -петл (и я даже не уверен, что вы можете применить его к существующему ufunc).

ОБНОВЛЕНИЕ Как насчет ufuncчто получить 3 или более параметров?Попытка outer метод дает ValueError: outer product only supported for binary functions.Например, scipy.special.eval_jacobi.

Ответы [ 2 ]

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

Изменение формы входных аргументов для широковещания .В этом случае измените форму degs на (5, 1) вместо просто (5,).Передача формы (5, 1) с формой (3,) приводит к форме (5, 3):

In [185]: import numpy as np

In [186]: import scipy.special

In [187]: degs = np.arange(5).reshape(-1, 1)  # degs has shape (5, 1)

In [188]: pnts = np.array([0.0, 0.1, 0.2])

In [189]: values = scipy.special.eval_chebyt(degs, pnts)

In [190]: values
Out[190]: 
array([[ 1.    ,  1.    ,  1.    ],
       [ 0.    ,  0.1   ,  0.2   ],
       [-1.    , -0.98  , -0.92  ],
       [-0.    , -0.296 , -0.568 ],
       [ 1.    ,  0.9208,  0.6928]])
0 голосов
/ 07 октября 2018

То, что вам нужно, это точно внешний метод ufuncs:

ufunc.outer (A, B, ** kwargs)

  Apply the ufunc op to all pairs (a, b) with a in A and b in B.
values = scipy.special.eval_chebyt.outer(degs, pnts)
#array([[ 1.    ,  1.    ,  1.    ],
#      [ 0.    ,  0.1   ,  0.2   ],
#      [-1.    , -0.98  , -0.92  ],
#      [-0.    , -0.296 , -0.568 ],
#      [ 1.    ,  0.9208,  0.6928]])

ОБНОВЛЕНИЕ

Дополнительные параметры необходимо передавать вручную. meshgrid часто помогает в этом, охватывая каждый параметр в измерении.Например:

n=3
alpha = numpy.array(range(5))
beta =  numpy.array(range(3))
x = numpy.array(range(2))

data = numpy.meshgrid(n,alpha,beta,x)
values = scipy.special.eval_jacobi(*data)
...