Как сделать так, чтобы 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]])