0

我想从 a 中得到一个给定两个值的矩阵ndarrayufunc例如:

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

上面的代码不起作用(它给出了 aValueError因为它尝试广播两个数组并且由于它们具有不同的形状而失败:(5,)和(3,));我想获得一个值矩阵,其中行对应于度数,列对应于多项式被评估的点(反之亦然,没关系)。

目前我的解决方法是简单地使用for-loop:

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

有没有办法做到这一点?一般来说,如果您有类似 array_like 的参数,您如何让ufunc用户知道您想要一个-n维数组?n

我知道numpy.vectorize,但这似乎既不比简单的循环更快也不优雅for(而且我什至不确定你是否可以将它应用于现有的ufunc)。

更新ufunc接收 3 个或更多参数的 's 呢?尝试outer方法给出了一个ValueError: outer product only supported for binary functions. 例如,scipy.special.eval_jacobi

4

2 回答 2

3

你需要的正是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)
于 2018-10-07T16:36:46.713 回答
1

重塑广播的输入参数。在这种情况下,将 的形状更改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]])
于 2018-10-07T17:02:19.740 回答