如何将矩阵从Matlab转换成Python?

2024-06-25 06:16:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Matlab中有以下我不熟悉的代码:

function segments = segmentEnergy(data, th)
    mag = sqrt(sum(data(:, 1:3) .^ 2, 2));
    mag = mag - mean(mag);

    above = find(mag>=th*std(mag));
    indicator = zeros(size(mag));
    indicator(above) = 1;
    plot(mag); hold on; plot(indicator*1000, 'r')
end

我用Python编写了以下函数:

^{pr2}$

我得到一个错误:

line 23, in segment_energy
indicator[above] = 1
IndexError: too many indices for array

data是从包含三轴加速度计数据的CSV文件中读取的pandasDataFrame。加速计数据的轴是xy和{}。数据帧的列按顺序是timestamptime skippedxyz、和{}。在

错误是因为Python代码中的mag是一个标量,我把它当作矩阵来处理。但是,我不确定他们是如何在MATLAB函数中将mag变成矩阵的。在


Tags: 数据函数代码dataplot错误function矩阵
3条回答

默认情况下,numpy.linalg.norm的输出将为您提供一个给定当前如何调用函数的标量值。由于mag的输出现在是标量,因此代码的其余部分将无法正常工作,原因如下:

  1. 使用单个标量执行平均值减法将得到一个值0(即mag <- mag - np.mean(mag) > 0)。

  2. above语句将始终返回单个元素的元组。此元素包含一个长度为1的NumPy数组,其中包含索引0,表示“array”的第一个元素(在本例中是标量)满足约束。通过使用np.std的默认定义,单个常量的标准偏差也为0,所以这一点总是可以满足的。

  3. 为单个标量值调用shape是未定义的,它实际上会给您一个空形状:()。请注意,如果不使用numpy.mean进行减法,则执行mag.shape实际上会给您一个错误,因为它不是NumPy数组。用np.mean进行减法将标量合并为NumPy数组。在

    注意:

    In [56]: mag = 10
    
    In [57]: type(mag)
    Out[57]: int
    
    In [58]: mag -= np.mean(mag)
    
    In [59]: type(mag)
    Out[59]: numpy.float64
    
  4. 最后,调用indicator创建代码将生成一个空维度数组,并且由于您试图索引到一个没有大小的数组中,它将给您一个错误。

假设mag被计算为某个值,观察这个可重复的错误。。。说。。。10和th = 1

^{pr2}$

因此,您的解决方案是重新思考如何编写此函数。MATLAB代码假设data已经是一个二维矩阵,所以它们独立地计算每行的范数或长度。因为我们现在知道输入是熊猫DataFrame,所以我们可以很容易地对其应用numpy操作,就像在MATLAB中一样。假设您的列在代码中被标记为xy和{},并且每个列都是一个numpy值数组,只需更改代码的第一行。在

def segment_energy(data, th):
    mag = np.sqrt(np.sum(data.loc[:, ['x','y','z']]** 2.0, axis=1)) # Change
    mag = np.array(mag) # Convert to NumPy array
    mag -= np.mean(mag)

    above = np.where(mag >= th * np.std(mag))
    indicator = np.zeros(mag.shape)
    indicator[above] = 1
    plt.plot(mag)
    plt.plot(indicator * 1000, 'r')
    plt.show()

代码中的第一个语句是MATLAB中代码的实际numy翻译。我们使用loc方法,它是pandasDataFrame的一部分,为您要查找的三个列编制索引。我们还需要转换成NumPy数组,以便其他计算工作。在

您也可以使用numpy.linalg.norm,但是指定一个要操作的轴。由于数据是二维的,请指定axis=1来计算矩阵的行范数:

mag = np.linalg.norm(data.loc[:, ['x', 'y', 'z']], axis=1)

上面的操作将把数据合并到一个NumPy数组中。在

相关问题 更多 >