取数组中每n个元素的平均值并将MATLAB代码转换为Python

时间:2019-06-22 23:53:27

标签: python arrays matlab numpy

我正在尝试将MATLAB程序转换为Python,并遇到某种循环的障碍:我有一个5868x3500矩阵,该矩阵包含5868个每日观察值,3500只股票的收益率和交易量之比,该数据用于产生通过每月取每只股票收益与其数量之比的平均值来衡量市场流动性。我有一个称为Dummymonth的5868x1向量,它为每月从1到270分配一个整数,每月约22个交易日(1,1,1,1,1,1,1,1,1,1,1... 2,2,2,2,2,2... 270,270,270)。

我坚持的循环需要通过根据Dummymonth值获取月平均值(即基本上取每22个值的平均值)将5868x3500矩阵转换为270x3500矩阵。

我尝试过尽可能干净地转换代码(用MATLAB的find()函数代替Python的.argwhere()),但是我对Python(和MATLAB而言)相对较新,因此代码存在问题对我来说似乎不是立即显而易见的。

这是我要模拟的MATLAB代码部分:

numberofmonth=Dummymonth(size(Ret,1));
i=1;
for di=1:numberofmonth
    v=find(Dummymonth==di);
    for j=1:size(Ret, 2)
        Amihud2(i,j)=nanmean(Amihud1(v,j));
    end
    i=i+1;
end

这是我在Python中拥有的东西:

import numpy as np
Amihud2 = np.empty((270, len(Amihud1)))
for month_num in range(0, 270):
    v = np.argwhere(dummy == month_num)
    for i in range(1, len(Amihud1)):
        for j in range(1, len(Amihud1[0])):
            Amihud2[i][j] = np.mean(Amihud1[v][j])

我通常看到的错误是“索引超出范围错误”。

1 个答案:

答案 0 :(得分:0)

我认为错误之一与Python的0索引有关。如果循环遍历并从1开始,则会错过第一个(索引0)值。这是一个解决方案(有很多):

#Create Dummy index
dummy =np.array([np.repeat(i,22) for i in np.arange(270)+1]).flatten()

#Make Dataset for example
dat = np.random.random((len(dummy),3500))

#Calculate average per month
dat2 = np.empty((270,3500))
i=-1
for m in np.unique(dummy):
    i=i+1
    dat2[i,:]=dat[dummy==m].mean(axis=0)