生成多个范德蒙德数组



我有一个函数,可以创建一个 2-dim 数组,一个范德蒙德矩阵,称为:

vandermonde(generator, rank)

其中生成器是一个 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扩展数组以创建一个新元素。

我的问题是:

  1. 我怎么能不使用标准的 Python 列表,直接使用 np 方法,因为np.append似乎没有我预期的那样表现,相反,它只是增长该数组而不是添加新的数组元素

  2. 有没有更直接的numpy方法?

我的范德蒙德函数是:

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)

最新更新