生成多个 vandermonde 数组

Generating multiple vandermonde arrays

我有一个创建 2 维数组的函数,一个 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)在我的 space 中被 h 倾斜(这里 h 是任意的,让我们调用 h=1).

因此我得到了以下确定性代码:

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 循环,如:

V=[]
for i in range(rank):
    V.append(vandermonde(generator - h*i, rank))
V = np.array(V)

这种方法很有效,但似乎也很有效 "patchy"。我尝试了如下 np.append 方法:

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. 是否有更直接的 numpy 方法?

我的 vandermonde 函数是:

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) 的 3 维数组,其中每个元素都是生成器偏斜范德蒙矩阵之一。对于上面的常量 (generator, rank, h) 我们有:

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

一些相关的想法可以在这个讨论中找到:

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

r = np.arange(rank)
V_out = (generator - h*r[:,None,None]) ** r[:,None]

我们也可以使用cumprod来获得另一种解的指数值-

gr = np.repeat(generator - h*r[:,None,None], rank, axis=1)
gr[:,0] = 1
out = gr.cumprod(1)