在python中的for循环中逐渐添加(2,n)数组

时间:2017-09-20 06:40:40

标签: python arrays numpy

我希望在循环的每一步中在for循环中逐步添加形状(2,N)的数组,其中数组大小为(2,1)。这就是我现在正在做的事情:

x = []
a = np.array([[0.5], [0.5]])
for i in range(0, N):
    x = np.append(x, a + (np.random.randn(2, 1)/np.sqrt(5))).reshape(i+1, 2)
x = x.T

有没有更好的方法来做到这一点而不需要在每次迭代中重新整形并最终转换整个数组?

3 个答案:

答案 0 :(得分:1)

您可以尝试在开头初始化数组: x = np.zeros((2,N))然后在for循环中填入np.random.randn(2) / np.sqrt(5)

答案 1 :(得分:1)

除非您迫切需要逐步填充数组,否则您可以使用NumPy的随机模块立即创建它:

x = np.random.randn(2, N) / np.sqrt(5) + 0.5

答案 2 :(得分:0)

np.append不是一个好的功能。最好使用concatenate或其中一个stacks。更好的是,做一个列表附加,最后用一个连接。并收集(1,2)数组:

In [400]: a = np.array([[0.5], [0.5]]).T
In [401]: x = []
In [402]: for i in range(0,6):
     ...:     x.append(a+np.random.randn(1,2)/np.sqrt(5))
     ...:        
In [403]: x
Out[403]: 
[array([[ 0.53535176,  0.43666667]]),
 array([[ 0.25599309,  1.48571245]]),
 array([[ 0.82575401,  0.90599888]]),
 array([[ 0.38033551,  0.54522437]]),
 array([[ 0.41806277,  0.86227303]]),
 array([[ 0.25251664,  0.36236433]])]
In [404]: X=np.concatenate(x, axis=0)
In [405]: X
Out[405]: 
array([[ 0.53535176,  0.43666667],
       [ 0.25599309,  1.48571245],
       [ 0.82575401,  0.90599888],
       [ 0.38033551,  0.54522437],
       [ 0.41806277,  0.86227303],
       [ 0.25251664,  0.36236433]])

循环也可以写成列表理解(如评论中所示)。

如果您创建(2,)元素而不是(1,2),则可以使用np.array(x)来组合2d数组。

In [406]: a = np.array([0.5,0.5])
In [407]: x = [a+np.random.randn(2)/np.sqrt(5) for _ in range(6)]
In [408]: x
Out[408]: 
[array([ 0.26945613,  0.90210773]),
 ....
 array([ 0.76008067,  0.83912968])]
In [409]: np.array(x)
Out[409]: 
array([[ 0.26945613,  0.90210773],
       [ 0.96109886, -0.69105254],
       [-0.01010202,  0.92225443],
       [ 1.01784239,  0.21049822],
       [ 0.47476442,  0.08274172],
       [ 0.76008067,  0.83912968]])

np.append应该看起来像一个列表追加,但做得不好。最好从一开始就了解如何使用concatenate将数组列表连接起来。