- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 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
。加速度计数据的轴是x
、y
和z
。数据框的列是timestamp
、time skipped
、x
、y
、z
和 label
的顺序。
错误是因为 Python 代码中的 mag
是标量,我将其视为矩阵。但是,我不确定他们如何将 mag
转换为 MATLAB 函数中的矩阵。
最佳答案
numpy.linalg.norm
的输出给定您当前调用函数的方式,默认情况下会给您一个标量值。因为 mag
的输出现在是一个标量,由于以下原因,其余代码将无法按预期运行:
使用单个标量执行均值减法将为您提供 0 值(即 mag <- mag - np.mean(mag) --> 0
)。
above
语句将始终返回单个元素的元组。该元素包含一个长度为 1 且包含索引 0 的 NumPy 数组,表示“数组”的第一个元素(在本例中为标量)满足约束条件。通过使用 np.std
的默认定义,单个常量的标准偏差也始终为 0,因此始终可以满足这一点。 .
调用 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
最后,调用 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
, y
和 z
在你的代码中,每一列都是一个 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/
在 Matlab 中,您可以选择创建新的“示例”脚本文件以及脚本、函数、类等。创建它们时,它们会获得一个脚本图标。 它们与其他标准脚本文件的处理方式有何不同? 是否有关于这些示例脚本类型的预期用途的文
我正在运行一个不是我自己编写的大 m 文件,它依赖于某些子函数。我想知道是否在所有嵌套函数的任何地方都使用了特定函数(在我的例子中是函数 eig.m(计算特征值))。有没有快速的方法来做到这一点? 亲
Matlab中有一个函数叫 copulafit .我怎样才能看到这个函数背后的代码?许多 Python 的 numpy 和 scipy 函数在 Github 上很容易开源,但由于某种原因我在 Gith
我定义了一个抽象基类measurementHandler < handle它定义了所有继承类的接口(interface)。这个类的两个子类是a < measurementHandler和 b < me
假设有一个矩阵 A = 1 3 2 4 4 2 5 8 6 1 4 9 例如,我有一个 Vector 包含该矩阵每一列的“类”
我有一个在后台运行的 Matlab 脚本。随着计算的进行,它会不断弹出进度栏窗口。这很烦人。 问题是我没有自己写 Matlab 脚本,这是一段很长很复杂的代码,我不想搞砸。那么如何在不修改 Matla
有没有办法从一个 matlab 程序中检测计算机上正在运行多少个 matlab 进程? 我想要恰好有 n 个 matlab 进程在运行。如果我的数量太少,我想创建它们,如果数量太多,我想杀死一些。您当
我正在测试我们在 Matlab 中开发的一个独立应用程序,当时我注意到它的内存使用量(根据 Windows 任务管理器)达到了 16gb 以上的数倍峰值。我决定在编译版本后面的脚本上使用 profil
我面临着一个相当棘手的问题。在 Matlab 中,命令 S = char(1044) 将俄语字母 д 放入变量 S。但是 disp(S) 返回空白符号,尽管内容实际上是正确的: >> S = char
我在这行 MATLAB 代码中遇到内存不足错误: result = (A(1:xmax,1:ymax,1:zmax) .* B(2:xmax+1,2:ymax+1,2:zmax+1) +
我正在寻找一种在 MATLAB 中比较有限顺序数据与非确定性顺序的方法。基本上,我想要的是一个数组,但不对包含的元素强加顺序。如果我有对象 a = [x y z]; 和 b = [x z y]; 我希
我有一个由 1 和 0 组成的二维矩阵。 mat = [0 0 0 0 1 1 1 0 0 1 1 1 1 1 0 0 1 0 0 0 1 0 1 1 0 0 1]; 我需
我可以在 Matlab 中用一组 x,y 点绘制回归线。但是,如果我有一组点(如下图),假设我有四组点,我想为它们绘制四条回归线……我该怎么做?所有的点都保存在 x,y 中。没有办法将它们分开并将它们
我正在尝试使用以下代码在 MATLAB 中绘制圆锥体。但是,当 MATLAB 生成绘图时,曲面中有一个间隙,如下图所示。谁能建议关闭它的方法? clearvars; close all; clc; [
我有一个 map称为 res_Map,包含一组不同大小的数组。我想找到用于存储 res_Map 的总内存。 正如您在下面看到的,看起来 res_Map 几乎不占用内存,而 res_Map 中的各个元素
有没有办法在 MATLAB 中组合 2 个向量,这样: mat = zeros(length(C),length(S)); for j=1:length(C) mat(j,:)=C(j)*S;
已结束。此问题不符合 Stack Overflow guidelines 。它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答它。 关闭 5 年前
我正在尝试将MatLab中的t copula适配到我的数据,并且我的功能是: u = ksdensity(range_1, range_1,'function','cdf'); v = ksdens
大家好,我目前正在尝试使用论文“多尺度形态学图像简化”中的 SMMT 运算符 Dorini .由于没有订阅无法访问该页面,因此我将相关详细信息发布在这里: 请注意,我将相关文章的部分内容作为图片发布。
我在MATLAB中编写代码,需要使用一个名为modwt的函数,该函数同时存在于两个我同时使用的工具箱(Wavelet和WMTSA)中。问题在于,一个版本仅返回一个输出,而另一个版本则返回三个输出。我应
我是一名优秀的程序员,十分优秀!