在Numpy中计算累计返回,数组索引的问题



我是使用numpy类的新手,我在操作数组的内容时遇到了问题。下面是代码:

# finance equation to apply to each element of array
for row in cum_ret:
   for col in row:
       if sum(row)!=0:
           row[col] = prev_row[col]*(1+row[col])
       else:
           row[col] = 1
       cum_ret[row][col] = row[col]
   prev_row = row
# see changed contents
for row in cum_ret:
print row

现在我得到一个错误说数组索引必须是整数或布尔类型。我得到它是因为'row'值也是一个数组所以它不能索引一个数组对象。那么做这件事的正确语法是什么,或者我应该使用它们的方法吗?

提前感谢

cum_ret数组是float64s的2d narray,是我要修改的数组。下面是输出的一小段:

[[ 0.          0.          0.          0.          0.        ]
 [ 0.00046187  0.00836672  0.00020435 -0.00048292  0.00342209]
 [-0.07633505 -0.00514199 -0.04133778 -0.02450642 -0.01865075]
 ..., 
 [ 0.01229435  0.00175341  0.00709808  0.00213371  0.0061171 ]
 [-0.0118614  -0.00994933 -0.00557095 -0.00141945 -0.00347423]
 [ 0.01214725 -0.00502466  0.00537611 -0.00035537 -0.00101685]]

这里是它发生的地方:

Traceback (most recent call last):
File "qstk1.py", line 37, in <module>
   cum_ret[row][col] = row[col]
IndexError: arrays used as indices must be of integer (or boolean) type

如果cum_ret是数组,则可以使用numpy.sum(cum_ret, axis=1)获得行和,并使用numpy.sum(cum_ret, axis=1) != 0立即在整个数组上生成测试。然后,您可以使用numpy.select()来应用您的条件。

如果你把一个print row语句在循环的开始,你会注意到它不是整数,而是一个numpy数组…这导致了你的错误。顺便说一句,您不应该需要任何这样的循环来执行此操作。

另一个注意事项:第一行发生了什么?前一行是什么?

编辑:

看了你的评论后,我认为你想要这样的东西:

import numpy
cum_ret = numpy.array([[0,0,0,0],[-0.234,-0.365,-0.634,-0.453], [-0.334,-0.465,-0.534,-0.653],[-0.134,-0.265,-0.334,-0.453]])
b = cum_ret + 1
c = numpy.cumprod(b, axis=0)

不需要循环,也不需要检查行为零的条件。

相关内容

  • 没有找到相关文章

最新更新