首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成多个范德蒙阵列

生成多个范德蒙阵列
EN

Stack Overflow用户
提问于 2018-06-20 12:50:20
回答 1查看 597关注 0票数 0

我有一个函数,它创建一个2 dim数组,一个Vandermonde矩阵,称为:

vandermonde(generator, rank)

其中生成器是一个n大小的数组,例如

generator = np.array([-1/2, 1/2, 3/2, 5/2, 7/2, 9/2])

rank=4

然后,我需要创建4个Vandermonde矩阵(因为rank=4)在我的空间中被h扭曲( h在这里是任意的,让我们调用h=1)。

因此,我附带了以下确定性代码:

代码语言:javascript
复制
V = np.array([
        vandermonde(generator-0*h, rank),
        vandermonde(generator-1*h, rank),
        vandermonde(generator-2*h, rank),
        vandermonde(generator-3*h, rank)
        ])

然后,我想对vandermonde执行多次手动调用,我使用了一个for-loop,如下所示:

代码语言:javascript
复制
V=[]
for i in range(rank):
    V.append(vandermonde(generator - h*i, rank))
V = np.array(V)

这种方法很好,但看上去太“零碎”了。我尝试了如下所示的np.append方法:

代码语言:javascript
复制
M = np.array([])
for i in range(rank):
    M = np.append(M,[vandermonde(generator - h*i, rank)])

但是没有像我预期的那样工作,似乎np.append扩展数组来创建一个新的元素。

我的问题是:

  1. 我怎么能不使用标准的Python列表,直接使用np方法,因为np.append似乎不像我期望的那样表现,相反它只是增长数组而添加了一个新的数组元素。
  2. 对此还有更直接的方法吗?

我的vandermonde功能是:

代码语言:javascript
复制
def vandermonde(generator, rank=None):
    """Returns a vandermonde matrix

    If rank not passwd returns a square vandermonde matrix
    """

    if rank is None:
        rank = len(generator)

    return np.tile(generator,(rank,1)) ** np.array(range(rank)).reshape((rank,1))

所期望的答案是一个大小为(generator, rank, rank)的三维数组,其中每个元素都是一个产生偏斜的范德蒙德矩阵。对于上面的常量(generator, rank, h),我们有:

代码语言:javascript
复制
V= array([[[  1.  ,   1.  ,   1.  ,   1.  ,   1.  ,   1.  ],
        [ -0.5 ,   0.5 ,   1.5 ,   2.5 ,   3.5 ,   4.5 ],
        [  0.25,   0.25,   2.25,   6.25,  12.25,  20.25],
        [ -0.12,   0.12,   3.38,  15.62,  42.88,  91.12]],

       [[  1.  ,   1.  ,   1.  ,   1.  ,   1.  ,   1.  ],
        [ -1.5 ,  -0.5 ,   0.5 ,   1.5 ,   2.5 ,   3.5 ],
        [  2.25,   0.25,   0.25,   2.25,   6.25,  12.25],
        [ -3.38,  -0.12,   0.12,   3.38,  15.62,  42.88]],

       [[  1.  ,   1.  ,   1.  ,   1.  ,   1.  ,   1.  ],
        [ -2.5 ,  -1.5 ,  -0.5 ,   0.5 ,   1.5 ,   2.5 ],
        [  6.25,   2.25,   0.25,   0.25,   2.25,   6.25],
        [-15.62,  -3.38,  -0.12,   0.12,   3.38,  15.62]],

       [[  1.  ,   1.  ,   1.  ,   1.  ,   1.  ,   1.  ],
        [ -3.5 ,  -2.5 ,  -1.5 ,  -0.5 ,   0.5 ,   1.5 ],
        [ 12.25,   6.25,   2.25,   0.25,   0.25,   2.25],
        [-42.88, -15.62,  -3.38,  -0.12,   0.12,   3.38]]])

在以下讨论中可以找到一些相关的想法:efficient-way-to-compute-the-vandermonde-matrix

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-20 13:06:08

使用broadcasting以矢量化的方式获得最终的3D数组-

代码语言:javascript
复制
r = np.arange(rank)
V_out = (generator - h*r[:,None,None]) ** r[:,None]

我们还可以使用cumprod实现另一个解决方案的指数值-

代码语言:javascript
复制
gr = np.repeat(generator - h*r[:,None,None], rank, axis=1)
gr[:,0] = 1
out = gr.cumprod(1)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50948684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档