gpt4 book ai didi

python - 如何将矩阵从 Matlab 转换为 Python?

转载 作者:太空狗 更新时间:2023-10-30 00:09:22 25 4
gpt4 key购买 nike

我在 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 编写了以下函数:

def segment_energy(data, th):
mag = np.linalg.norm((data['x'], data['y'], data['z']))
print "This is the mag: " + str(mag)
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()

我得到一个错误:

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

data 是从包含三轴加速度计数据的 CSV 文件中读取的 pandas DataFrame。加速度计数据的轴是xyz。数据框的列是timestamptime skippedxyzlabel 的顺序。

错误是因为 Python 代码中的 mag 是标量,我将其视为矩阵。但是,我不确定他们如何将 mag 转换为 MATLAB 函数中的矩阵。

最佳答案

numpy.linalg.norm 的输出给定您当前调用函数的方式,默认情况下会给您一个标量值。因为 mag 的输出现在是一个标量,由于以下原因,其余代码将无法按预期运行:

  1. 使用单个标量执行均值减法将为您提供 0 值(即 mag <- mag - np.mean(mag) --> 0 )。

  2. above语句将始终返回单个元素的元组。该元素包含一个长度为 1 且包含索引 0 的 NumPy 数组,表示“数组”的第一个元素(在本例中为标量)满足约束条件。通过使用 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 :

In [60]: mag = 10

In [61]: mag -= np.mean(mag)

In [62]: mag.shape
Out[62]: ()

In [63]: th = 1

In [64]: above = np.where(mag >= th * np.std(mag))

In [65]: indicator = np.zeros(mag.shape)

In [66]: indicator
Out[66]: array(0.0)

In [67]: mag
Out[67]: 0.0

In [68]: indicator[above] = 1
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-67-adf9cff7610a> in <module>()
----> 1 indicator[above] = 1

IndexError: too many indices for array

因此,您的解决方案是重新考虑如何编写此函数。 MATLAB 代码假定 data已经是一个二维矩阵,所以他们独立地计算每行的范数或长度。因为我们现在知道输入是 Pandas DataFrame ,我们可以很容易地申请numpy对它的操作就像在 MATLAB 中所做的一样。假设您的列标记为 x , yz在你的代码中,每一列都是一个 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 中的实际 NumPy 翻译。我们使用 loc pandas 的一部分的方法 DataFrame索引您要查找的三列。我们还需要转换为 NumPy 数组,以便进行其余计算。

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

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

以上将为您将数据合并为一个 NumPy 数组。

关于python - 如何将矩阵从 Matlab 转换为 Python?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44657551/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com