Matlab 到 Python:返回数组而不是整数
Matlab to Python : returning an array instead of integer
我的 Matlab 代码中有一个语句:
a = find(abs(ASE_lamda-YDFA_lam_s)<1e-15);
执行后得到的输出为:
octave:50> whos a
Variables in the current scope:
Attr Name Size Bytes Class
==== ==== ==== ===== =====
a 1x1 8 double
Total is 1 element using 8 bytes
octave:51> a
a = 33
我已在以下方法中使用 NumPy 包将代码迁移到 Python:
a = np.nonzero(np.abs(ASE_lamda-YDFA_lam_s)<1e-15)
但是变量a的类型是元组
(array([32]),)
迁移上述代码的正确方法是什么?
它们是等价的。如您所见,您的 Matlab/Octave 代码返回了 1x1 维矩阵 a = 33
而 NumPy 为您提供了一维向量 a = [32]
.
它是元组的原因是因为 nonzero
为您提供了每个维度的索引元组。
如果您正在处理一维数据(这里可能就是这种情况),您可以考虑使用 numpy.flatnonzero
。
我认为令人困惑的是 Octave(可能还有 Matlab)将 1x1 矩阵视为标量,而 NumPy 却没有。
因此,要获得单个条目,您只需通过正常索引获取第一个(也是唯一一个)元素:
a = a[0]
在 Matlab 和 NumPy 之间切换时,您可能会感到困扰的一点是,前者在索引和矩阵形状方面更为宽松。在 NumPy 中,形状为 (N,)
和 (N, 1)
的数组之间存在差异,例如,您可能会 运行乘法矩阵。
我的 Matlab 代码中有一个语句:
a = find(abs(ASE_lamda-YDFA_lam_s)<1e-15);
执行后得到的输出为:
octave:50> whos a
Variables in the current scope:
Attr Name Size Bytes Class
==== ==== ==== ===== =====
a 1x1 8 double
Total is 1 element using 8 bytes
octave:51> a
a = 33
我已在以下方法中使用 NumPy 包将代码迁移到 Python:
a = np.nonzero(np.abs(ASE_lamda-YDFA_lam_s)<1e-15)
但是变量a的类型是元组
(array([32]),)
迁移上述代码的正确方法是什么?
它们是等价的。如您所见,您的 Matlab/Octave 代码返回了 1x1 维矩阵 a = 33
而 NumPy 为您提供了一维向量 a = [32]
.
它是元组的原因是因为 nonzero
为您提供了每个维度的索引元组。
如果您正在处理一维数据(这里可能就是这种情况),您可以考虑使用 numpy.flatnonzero
。
我认为令人困惑的是 Octave(可能还有 Matlab)将 1x1 矩阵视为标量,而 NumPy 却没有。
因此,要获得单个条目,您只需通过正常索引获取第一个(也是唯一一个)元素:
a = a[0]
在 Matlab 和 NumPy 之间切换时,您可能会感到困扰的一点是,前者在索引和矩阵形状方面更为宽松。在 NumPy 中,形状为 (N,)
和 (N, 1)
的数组之间存在差异,例如,您可能会 运行乘法矩阵。