Skip to main content
 首页 » 编程设计

python之在 Numpy 中计算累积返回,数组索引问题

2025年05月04日19yxwkf

我是 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 

现在我收到一条错误消息,指出使用的数组索引必须是整数或 bool 类型。我明白了,因为“行”值也是一个数组,所以它不能索引数组对象。那么执行此操作的正确语法是什么,或者它们是我应该使用的方法吗?

提前致谢

cum_ret 数组是 float64s 的二维 ndarray,是我要修改的数组。 这是输出的一小段:

[[ 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) 

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