数组追加并转换为numpy

时间:2017-05-24 14:47:24

标签: python arrays numpy

这是我的代码:

z=12
co=0
for x in range(1900,2050):
        z=x*z
        co += 1
        b= [1, 2011, co, z]

        #conversion start 
        b=np.array(b) 
        c.append(b)   
        d=np.array(c) 
        #conversion end

例如,循环中b数组中的第一个值是[1, 2011, 1, 22800 ]

在第一个转换行之后(b = np.array(b))b变为[ 1 2011 4 156755]

c看起来像

[array([    1,  2011,     1, 22800]), array([     1,   2011,      2, 22812]), array([     1,   2011,      3, 22824]), array([     1,   2011,      4, 22836])] 

4次循环后d的例子:

[[     1   2011      1  22800]
 [     1   2011      2 22812]
 [     1   2011      3 22824]
 [     1   2011      4 22836]] 

我需要更改转换部分中的代码,以便输出d数组的格式与示例中的格式相同。现在代码所做的是从b创建一个数组,然后将该数组附加到c然后将c转换为numpy数组。 有没有办法更快地做到这一点?由于所有这些代码都在一个大循环中(未显示),因此创建,追加和转换以生成d数组需要花费大量时间。我无法将该代码移到那个巨大的循环之外,数学仅用于解释目的:)

谢谢

1 个答案:

答案 0 :(得分:0)

通常我们建议在列表中累积值,并在结尾处创建一次数组:

In [16]: c=[]
    ...: z=12
    ...: co=0
    ...: for x in range(1900,1904):
    ...:         z=x*z
    ...:         co += 1
    ...:         b= [1, 2011, co, z]
    ...:         c.append(b)
    ...:     
In [17]: c
Out[17]: 
[[1, 2011, 1, 22800],
 [1, 2011, 2, 43342800],
 [1, 2011, 3, 82438005600],
 [1, 2011, 4, 156879524656800]]
In [18]: np.array(c)
Out[18]: 
array([[              1,            2011,               1,           22800],
       [              1,            2011,               2,        43342800],
       [              1,            2011,               3, 82438005600],
       [              1,            2011,               4, 156879524656800]], dtype=int64)

您的z计算不切实际,变得非常大 - 对于' int64'来说太大了。