如果给定两个类似数组的操作数,如何使ufunc输出一个矩阵(而不是试图广播它们)?

2024-10-17 08:27:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从ufunc中得到给定两个ndarray的值的矩阵,例如:

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)

有办法吗?一般来说,如果有n类数组参数,如何让ufunc知道您需要一个n维数组?你知道吗

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

更新接收3个或更多参数的ufunc怎么样?尝试outer方法会得到ValueError: outer product only supported for binary functions。例如,scipy.special.eval_jacobi。你知道吗


Tags: numpyforevalrange矩阵scipy数组array
2条回答

您需要的正是ufuncs的outer方法:

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)

重塑broadcasting的输入参数。在这种情况下,将degs的形状改为(5,1)而不是(5,1)。与形状(3,1)一起广播的形状(5,1)产生形状(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]])

相关问题 更多 >