生成多个 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
扩展数组而不是创建一个新元素。
我的问题是:
我怎么能不使用标准 Python 列表,直接使用 np 方法导致 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))
预期答案是一个大小为 (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)
我有一个创建 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
扩展数组而不是创建一个新元素。
我的问题是:
我怎么能不使用标准 Python 列表,直接使用 np 方法导致
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))
预期答案是一个大小为 (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)