Python 如何使用numpy.frompyfunc返回元素数组而不是数组数组?

Python 如何使用numpy.frompyfunc返回元素数组而不是数组数组?,python,arrays,numpy,numpy-ufunc,Python,Arrays,Numpy,Numpy Ufunc,我正在使用SHTOOLS包中的PLegendre函数。它返回特定参数的勒让德多项式数组。PLegendre(lmax,x)返回一组勒让德多项式P_0(x)到P_lmax(x)。它的工作原理如下: In [1]: from pyshtools import PLegendre loading shtools documentation In [2]: import numpy as np In [3]: PLegendre(3,0.5) Out[3]: array([ 1. , 0.5

我正在使用SHTOOLS包中的PLegendre函数。它返回特定参数的勒让德多项式数组。PLegendre(lmax,x)返回一组勒让德多项式P_0(x)到P_lmax(x)。它的工作原理如下:

In [1]: from pyshtools import PLegendre
loading shtools documentation

In [2]: import numpy as np

In [3]: PLegendre(3,0.5)
Out[3]: array([ 1.    ,  0.5   , -0.125 , -0.4375])
我想传递一个数组作为参数,所以我使用frompyfunc

In [4]: legendre=np.frompyfunc(PLegendre,2,1)

In [5]: legendre(3,np.linspace(0,1,4))
Out[5]: 
array([array([ 1. ,  0. , -0.5, -0. ]),
   array([ 1.        ,  0.33333333, -0.33333333, -0.40740741]),
   array([ 1.        ,  0.66666667,  0.16666667, -0.25925926]),
   array([ 1.,  1.,  1.,  1.])], dtype=object)
输出是一个数组数组。我知道我可以通过切片数组从中创建一个元素数组

In [6]: a=legendre(3,np.linspace(0,1,4))

In [7]: array([a[i][:] for i in xrange(4)])
Out[7]: 
array([[ 1.        ,  0.        , -0.5       , -0.        ],
   [ 1.        ,  0.33333333, -0.33333333, -0.40740741],
   [ 1.        ,  0.66666667,  0.16666667, -0.25925926],
   [ 1.        ,  1.        ,  1.        ,  1.        ]])

但是。。有没有一种方法可以直接实现这一点,而不必对数组数组进行切片?

我认为这不能像在
np.vectorize的例子中已经指出的那样直接完成,它几乎完成了同样的事情。请注意,通过使用
np.frompyfunc
,您的代码并不比普通的
for
循环快。。。代码只是看起来更好

但是,您可以使用
np.vstack
而不是列表

a = legendre(3,np.linspace(0,1,4))
np.vstack(a)

np.frompyfunc
是编译的,所以我必须深入到源代码中,看看它到底在做什么。但它似乎假设func输出是一个(难以理解的)Python对象

foo1 = np.frompyfunc(np.arange,1,1)
foo2 = np.vectorize(np.arange,otypes='O')
这两个函数产生相同的输出,尽管
foo1
更快

foo1(np.arange(4))
生成不同大小的数组

array([array([], dtype=int32), array([0]), array([0, 1]), array([0, 1, 2])], dtype=object)
其中as
foo1(np.one((4,)
都是相同的,理论上可以叠加

在循环期间或之后,没有人试图测试对象是否是数组(或列表),以及它们是否可以组合成单个高维数组

plonser
使用
vstack
是个好主意。事实上
frompyfunc
plus
vstack
比更常见的列表理解plus
vstack
更快

In [54]: timeit np.vstack([np.arange(i) for i in 10*np.ones((10,))])
10000 loops, best of 3: 169 µs per loop

In [55]: timeit np.vstack(foo1(10*np.ones((10,))))
10000 loops, best of 3: 127 µs per loop