在阵列中使用更新的值

时间:2016-02-16 01:32:19

标签: python numpy pandas

这是我正在使用的代码:

import pandas as pd
z = pd.Series(data = [1,2,3,4,5,6,7], index = xrange(1,8))
array = []
for i in range(1,8):
    array.append(z[i]*2)
    print array

它正是我告诉它的,因为我无法弄清楚如何进行简单的迭代。这是打印输出

[2]
[2, 4]
[2, 4, 6]
[2, 4, 6, 8]
[2, 4, 6, 8, 10]
[2, 4, 6, 8, 10, 12]
[2, 4, 6, 8, 10, 12, 14]

我想要的是python使用数组中的更新值,因此所需的输出将是:

[2]
[2, 4]
[2, 4, 8]
[2, 4, 8, 16]
[2, 4, 8, 16, 32]
[2, 4, 8, 16, 32, 64]
[2, 4, 8, 16, 32, 64, 128]

感谢您的帮助。 的修改 我第一次使用的例子太简单了,请使用下面的示例代码回答

import pandas as pd
sample = pd.Series(data = [ -3.2 ,  30.66,   7.71,   9.87], index = range(0,4))
testarray = []
for i in range(0,4):
    testarray.append(100000*(1+sample.values[i]/100))
    print testarray

这会产生

[96800.0, 130660.0, 107710.0, 109870.0]

当所需数字为: 96800 126478.88 136230.4016 149676.3423

所以不是使用100000,而是希望它在第二次迭代时使用96800,依此类推。谢谢!

2 个答案:

答案 0 :(得分:4)

我认为你要做的就是计算2的幂,而不是2的乘法:

array.append(2**z[i])

答案 1 :(得分:2)

您想要在表达式中使用累积列表的最后一个值。

例如:

data = [ -3.2 ,  30.66,   7.71,   9.87]  # the input list for `sample`

In [686]: test=[100000]    
In [687]: for i in range(4):
    test.append(test[-1]*(1+data[i]/100))
In [688]: test
Out[688]: [100000, 96800.0, 126478.88, 136230.401648, 149676.3422906576]

我可以使用test=[]启动此功能,但之后我会测试列表是否为空,并使用1000000代替test[-1]。因此,将100000放在列表中首先是逻辑上更简单。

另一种选择是维护每次迭代更新的临时变量:

In [689]: mult=100000
In [690]: test=[]
In [691]: for i in range(4):
    test.append(mult*(1+data[i]/100))
    mult=test[-1]

mult *= (1+data[i]/100)
test.append(mult)

但由于这是pandas,我还可以使用一个矢量化调用进行计算。 numpy数组等效于:

In [697]: data_arr=np.array(data)
In [698]: np.cumprod(1+data_arr/100)
Out[698]: array([ 0.968     ,  1.2647888 ,  1.36230402,  1.49676342])

cumprod是累积产品(就像更常见的累积总和)。

你的第一个例子可以用:

制作
In [709]: np.cumprod([2 for _ in range(7)])
Out[709]: array([  2,   4,   8,  16,  32,  64, 128])

In [710]: np.cumprod(np.ones(7,int)*2)
Out[710]: array([  2,   4,   8,  16,  32,  64, 128])