Python 通过Numpy/Pandas使用(nx1)数据创建一个nxm多项式数组

Python 通过Numpy/Pandas使用(nx1)数据创建一个nxm多项式数组,python,pandas,numpy,Python,Pandas,Numpy,我使用以下命令创建了一个数组: Using np.column_stack np.column_stack((a, a**2, a**3)) 使用 这里有一种方法: 你在这里描述的东西叫做anumpy内置了此功能(比在大型矩阵上广播性能更好) Vandermonde矩阵的第一列始终为1,因此如果愿意,可以将其过滤掉 只是为了验证一下: a = np.random.normal(0, 1, 10_000) In [99]: %timeit np.vander(a, 100, incr

我使用以下命令创建了一个数组:

Using 
np.column_stack

np.column_stack((a, a**2, a**3))
使用


这里有一种方法:


你在这里描述的东西叫做a
numpy
内置了此功能(比在大型矩阵上广播性能更好)

Vandermonde矩阵的第一列始终为
1
,因此如果愿意,可以将其过滤掉



只是为了验证一下:

a = np.random.normal(0, 1, 10_000)

In [99]: %timeit np.vander(a, 100, increasing=True)[:, 1:]
8.37 ms ± 97 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [100]: %timeit a[:, None]**np.arange(1, 100)
51.4 ms ± 904 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

在大型矩阵中,
vander
beats广播:



如果你不想要一个严格递增的矩阵,这将变得不太有用,并将计算不必要的幂,在这种情况下,你应该回到广播解决方案。

所有,非常感谢你的回答。我是Python的初学者,很高兴看到三种不同的方法来解决这个问题。我阅读并自学了这三方面的知识


再次感谢

在我的机器上,由于
**
操作缓慢,vander
在与OP大小相同的较小矩阵上击败广播解决方案。
a = np.random.normal(0,1,50)

out = a[:,None]**np.arange(1,4)

print(out.shape)
# (50, 3)
a = np.random.normal(0, 1, 50)

np.vander(a, 4, increasing=True)[:, 1:]
array([[ 4.21022633e-01,  1.77260058e-01,  7.46304963e-02],   
       [-9.37208666e-02,  8.78360084e-03, -8.23206683e-04],   
                          ...   
       [-9.02260087e-01,  8.14073265e-01, -7.34505815e-01],   
       [ 1.21125200e+00,  1.46713140e+00,  1.77706584e+00]])  
>>> np.isclose(np.vander(a, 4, increasing=True)[:, 1:], a[:, None]**np.arange(1, 4)).all()
True
a = np.random.normal(0, 1, 10_000)

In [99]: %timeit np.vander(a, 100, increasing=True)[:, 1:]
8.37 ms ± 97 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [100]: %timeit a[:, None]**np.arange(1, 100)
51.4 ms ± 904 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)