【问题标题】:Taking the mean of every n elements in an array and converting MATLAB code to Python取数组中每 n 个元素的平均值并将 MATLAB 代码转换为 Python
【发布时间】:2019-06-22 23:53:27
【问题描述】:

我正在尝试将 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])

我经常看到的错误是“索引越界错误”。

【问题讨论】:

    标签: python arrays matlab numpy


    【解决方案1】:

    我认为其中一个错误与 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)
    

    【讨论】:

    • 谢谢!我的声誉不允许我投票,但我非常感谢您的回应。如果我收到后续错误,我会采纳您的建议并回复。
    • 这是对您的代码的改进:dummy = np.repeat(np.arange(1, 271), 22) 更具可读性。
    • 你不需要独一无二的。你知道你输入了什么:np.arange(1, 271)
    • 当使用for m in np.arange(1, 271):而不是i你可以使用m - 1
    • 谢谢大家的回复!我尝试运行类似于@Rowan_Gaffney 的代码,但它似乎引发了另一个错误:IndexError: boolean index did not match indexed array along dimension 1; dimension is 3500 but corresponding boolean dimension is 1。关于为什么会发生这种情况的任何想法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 2013-11-28
    • 1970-01-01
    • 2013-04-04
    相关资源
    最近更新 更多