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))
使用
这里有一种方法:
你在这里描述的东西叫做anumpy
内置了此功能(比在大型矩阵上广播性能更好)
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)