我使用以下命令创建了一个数组:
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
答案 0 :(得分:3)
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 matrix。 numpy
具有内置功能(比在大型矩阵上播放的效果更好)
范德蒙德矩阵的第一列始终为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的初学者,很高兴看到解决此问题的三种不同方法。我阅读并自学了这三个方面。
再次感谢!