[英]Create a n x m array of polynomials using a (n x 1) data through Numpy/Pandas
我使用以下方法创建了一个数组:
𝑥𝑖 = np.random.normal(0,1,50), which gave me
array([ 1.92024714, -0.19882742, -0.26836024, 0.32805879, -0.32085809,
-0.23569939, 0.22310599, 0.5483915 , -0.13106083, -1.03798811,
0.4586899 , -1.7378367 , -0.49868295, 1.58943447, 0.92153814,
0.38894787, -1.26605208, 0.44308314, 1.10222734, 0.40031394,
-1.2126154 , 0.26871733, -0.85161259, 0.15853002, -0.18531145,
-0.18069696, 0.19121711, 0.16586507, 0.43668293, 0.38395065,
-1.02418998, 0.10464186, -0.02777545, -0.30571787, 1.0690931 ,
-0.67266002, 2.00256049, -0.05156432, -1.03735733, 0.27650841,
-0.53300549, -0.4301668 , 1.01371008, -0.70780846, 0.11577668,
0.19328765, -0.72971236, 1.61804424, -0.69770352, -1.33161613])
对于这个数组的每个元素,我怎么能做以下给我一个像这样的50x3矩阵 - 任何建议?
𝑥1^1 𝑥1^2 𝑥1^3
𝑥2^1 𝑥2^2 𝑥2^3
𝑥3^1 𝑥3^2 𝑥3^3
.
.
𝑥50^1 𝑥50^2 𝑥50^3
即上面50x1数组中的数字会在50 x 3数组中看到这个数字
1.92024714 3.68734907867818 7.08062152251341
-0.19882742 0.03953234294385 -0.00786011375408
-0.26836024 0.07201721841285 -0.01932655801740
.
.
.
.
.
-1.33161613 1.77320151767618 -2.36122374267808
np.column_stack((a, a**2, a**3))
array([[ 1.92024714e+00, 3.68734908e+00, 7.08062152e+00],
[-1.98827420e-01, 3.95323429e-02, -7.86011375e-03],
... , ... , ...
[-6.97703520e-01, 4.86790202e-01, -3.39635237e-01],
[-1.33161613e+00, 1.77320152e+00, -2.36122374e+00]])
这是利用广播的一种方式:
a = np.random.normal(0,1,50)
out = a[:,None]**np.arange(1,4)
print(out.shape)
# (50, 3)
你在这里描述的是一个Vandermonde矩阵 。 numpy
有内置(并且比在大型矩阵上广播更高效)
Vandermonde矩阵的第一列始终为1
,因此您可以根据需要对其进行过滤。
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
在大型基础上, vander
节拍广播:
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)
如果你不想要一个严格增加的矩阵,这将变得不那么有用,并将计算不必要的权力,在这种情况下你应该回到广播的解决方案。
所有,非常感谢您的回复。 我是Python的初学者,很高兴看到解决这个问题的三种不同方法。 我阅读并教育了自己三个方面。
再次感谢 !!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.