通过Numpy / Pandas使用(n x 1)个数据创建一个n x m多项式数组

时间:2019-07-24 14:29:42

标签: python pandas numpy

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

export default () => {
  const {
    data: { isLoggedIn }
  } = useQuery(QUERY);

  const {
    data: { userinfo }
  } = useQuery(Addinfo_QUERY, {
    variables: { token: localStorage.getItem("jwt") }
  });

  return (
    <React.Fragment>
      {console.log(userinfo.user.addinfo)}
      <HashRouter>
        <AppPresenter isLoggedIn={isLoggedIn} addinfo={addinfo} />
      </HashRouter>
    </React.Fragment>
  );
};

对于该数组的每个元素,我该如何执行以下操作以给我一个50x3的矩阵,如下所示–任何建议?

?? = 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])

即上面50x1数组中的数字在50 x 3数组中看起来是这样

?1^1     ?1^2     ?1^3
?2^1     ?2^2     ?2^3
?3^1     ?3^2     ?3^3
.
.
?50^1     ?50^2     ?50^3

4 个答案:

答案 0 :(得分:3)

使用np.column_stack

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]])

答案 1 :(得分:3)

这是利用broadcasting的一种方法:

a = np.random.normal(0,1,50)

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

print(out.shape)
# (50, 3)

答案 2 :(得分:2)

您在此处描述的称为Vandermonde matrixnumpy具有内置功能(比在大型矩阵上播放的效果更好)

范德蒙德矩阵的第一列始终为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)

如果您不希望严格增加矩阵,那么它将变得远没有用处,并且会计算出不必要的功效,在这种情况下,您应该使用广播的解决方案。

答案 3 :(得分:0)

非常感谢您的回复。我是Python的初学者,很高兴看到解决此问题的三种不同方法。我阅读并自学了这三个方面。

再次感谢!