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

Я хотел бы получить матрицу значений с учетом двух 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 ответа

Решение

Что вам нужно, так это внешний метод 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]])

ОБНОВИТЬ

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

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)

Измените входные аргументы для трансляции. В этом случае измените форму 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]])
Другие вопросы по тегам