如何使用从PyFunc返回一个元素数组而不是数组数组?

2024-10-02 02:24:30 发布

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

我正在使用SHTOOLS包中的PLegendre函数。它返回特定参数的Legendre多项式数组。PLegendre(lmax,x)返回Legendre多项式的数组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。在

^{pr2}$

输出是一个数组。我知道可以通过对数组进行切片来创建元素数组。在

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.        ]])

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


Tags: 函数infromimport参数np切片数组
2条回答

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

foo1 = np.frompyfunc(np.arange,1,1)
foo2 = np.vectorize(np.arange,otypes='O')

这两个函数产生相同的输出,尽管foo1更快。在

^{pr2}$

生成大小不同的数组

array([array([], dtype=int32), array([0]), array([0, 1]), array([0, 1, 2])], dtype=object)

其中asfoo1(np.ones((4,))都是相同的,理论上可以叠加。在

在循环期间或之后,不会尝试测试对象是否是数组(或列表)以及它们是否可以组合成一个高维数组。在

使用plonser's是个好主意。事实上,frompyfuncvstack比更常见的列表理解加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

我认为它不能像前面已经指出的那样,直接做,在{}的情况下,它做了几乎相同的事情。请注意,使用np.frompyfunc,您的代码不会比普通的for循环快。。。代码只是看起来更好。在

但是,您可以使用np.vstack代替列表理解

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

相关问题 更多 >

    热门问题