Python 生成多个vandermonde阵列

Python 生成多个vandermonde阵列,python,arrays,numpy,linear-algebra,Python,Arrays,Numpy,Linear Algebra,我有一个函数,它创建了一个2维数组,一个Vandermonde矩阵,称为: vandermonde(生成器,秩) 例如,其中生成器是一个n大小的阵列 generator=np.array([-1/2,1/2,3/2,5/2,7/2,9/2]) 和rank=4 然后我需要创建4个范德蒙矩阵(因为rank=4)在我的空间中被h倾斜(这里h是任意的,我们调用h=1) 因此,我提供了以下确定性代码: V = np.array([ vandermonde(generator-0*h, ra

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

vandermonde(生成器,秩)

例如,其中生成器是一个n大小的阵列

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

rank=4

然后我需要创建4个范德蒙矩阵(因为
rank=4
)在我的空间中被
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)
这种方法很好,但似乎太“零碎”。我尝试了一种
np.append
方法,如下所示:

M = np.array([])
for i in range(rank):
    M = np.append(M,[vandermonde(generator - h*i, rank)])
但是没有像我预期的那样工作,似乎
np。append
扩展数组以创建新元素

我的问题是:

  • 我怎么能不使用标准的Python列表,直接使用np方法呢?因为append的行为似乎不像我预期的那样,它只是增加了该数组,而不是添加了一个新的数组元素

  • 有没有更直接的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))
    
    预期的答案是一个三维数组,其大小
    (生成器,秩,秩)
    ,其中每个元素都是生成器倾斜的vandermonde矩阵之一。对于上述常数(
    生成器,秩,h
    ),我们有:


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

    使用矢量化方式获得最终的
    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)
    

    共享
    vandermonde
    ?@Divakar-sure的实现。Added.ppl,就这么免费投票吗?没有添加任何注释。Numpy是有效的,因为它与固定大小的数组一起工作。方法
    np.append
    并不是真正有效的方法,实际上是在扩展数组(这意味着修改大小=>infecient)。为了提高效率,您需要在将元素放入数组之前创建一个大小合适的数组。由于我没有完全获得所需的输入/输出,因此很难提出更好的建议。添加预期的输出和数组维度。似乎主广播是必须的。我想这甚至会帮助我重写
    vandermonde
    函数。@Lin是的,它将是:
    (generator-h*I)**np.arange(rank)[:无]
    @Lin这也会很有帮助:@kmario23谢谢,这真的为这个问题增加了一些想法。
    gr = np.repeat(generator - h*r[:,None,None], rank, axis=1)
    gr[:,0] = 1
    out = gr.cumprod(1)