这是我的代码:
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数组需要花费大量时间。我无法将该代码移到那个巨大的循环之外,数学仅用于解释目的:)
谢谢
答案 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'来说太大了。