我在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
。加速计数据的轴是x
、y
和{timestamp
、time skipped
、x
、y
、z
、和{
错误是因为Python代码中的mag
是一个标量,我把它当作矩阵来处理。但是,我不确定他们是如何在MATLAB函数中将mag
变成矩阵的。在
默认情况下,
numpy.linalg.norm
的输出将为您提供一个给定当前如何调用函数的标量值。由于mag
的输出现在是标量,因此代码的其余部分将无法正常工作,原因如下:使用单个标量执行平均值减法将得到一个值0(即
mag <- mag - np.mean(mag) > 0
)。above
语句将始终返回单个元素的元组。此元素包含一个长度为1的NumPy数组,其中包含索引0,表示“array”的第一个元素(在本例中是标量)满足约束。通过使用np.std
的默认定义,单个常量的标准偏差也为0,所以这一点总是可以满足的。为单个标量值调用
shape
是未定义的,它实际上会给您一个空形状:()
。请注意,如果不使用numpy.mean
进行减法,则执行mag.shape
实际上会给您一个错误,因为它不是NumPy数组。用np.mean
进行减法将标量合并为NumPy数组。在注意:
最后,调用
indicator
创建代码将生成一个空维度数组,并且由于您试图索引到一个没有大小的数组中,它将给您一个错误。假设
^{pr2}$mag
被计算为某个值,观察这个可重复的错误。。。说。。。10和th = 1
:因此,您的解决方案是重新思考如何编写此函数。MATLAB代码假设},并且每个列都是一个
data
已经是一个二维矩阵,所以它们独立地计算每行的范数或长度。因为我们现在知道输入是熊猫DataFrame
,所以我们可以很容易地对其应用numpy
操作,就像在MATLAB中一样。假设您的列在代码中被标记为x
、y
和{numpy
值数组,只需更改代码的第一行。在代码中的第一个语句是MATLAB中代码的实际numy翻译。我们使用
loc
方法,它是pandasDataFrame
的一部分,为您要查找的三个列编制索引。我们还需要转换成NumPy数组,以便其他计算工作。在您也可以使用
numpy.linalg.norm
,但是指定一个要操作的轴。由于数据是二维的,请指定axis=1
来计算矩阵的行范数:上面的操作将把数据合并到一个NumPy数组中。在
相关问题 更多 >
编程相关推荐