【问题标题】:Most Elegant Implementation of MATLAB's "vec" Function in NumPyMATLAB 的“vec”函数在 NumPy 中最优雅的实现
【发布时间】:2014-10-04 13:51:27
【问题描述】:

在 MATLAB 中有一个称为 vec 的函数,它接受一个矩阵并将列堆叠成一个向量。例如,如果我们将以下矩阵称为“X”:

[1 2]
[3 4]

然后vec(X) 将返回向量:

[1]
[3]
[2]
[4]

似乎没有任何直接的实现,并且“NumPy for MATLAB users”没有直接的等价物。

那么,如果给定一个 numpy 数组(表示矩阵),那么一条非常优雅的 NumPy 行会重现这个结果吗?只是想看看这可以做得多么简洁/优雅。谢谢!

【问题讨论】:

  • 我在 Matlab 中从未听说过 vec。也许你的意思是this on the MathWorks File Exchange?无论如何,它似乎只是 Matlab 中用于二维数组(向量和矩阵)的X(:)。

标签: python matlab numpy vectorization


【解决方案1】:

您可以使用“Fortran”order 选项,例如reshape:

>>> import numpy as np
>>> a = np.array([[1, 2], [3, 4]])
>>> a.reshape((-1, 1), order="F")
array([[1],
       [3],
       [2],
       [4]])

【讨论】:

  • 这正是我所追求的。不幸的是,使用 flatten 会将 NumPy 数组转换为应有的状态,而使用 Fortran 排序似乎可以保留这一点。很好的答案。
【解决方案2】:

我想你想要的是flatten()

EG:

>>> import numpy as np
>>> a = np.array([[1, 2], [3, 4]])

>>> a.flatten('F')
>>> array([1, 3, 2, 4])

谢谢@jonrsharpe,实际上我也只是查了一下!顺便说一句:使用a.T.flatten() 转置数组是使用order='F' 更改顺序的替代方法

【讨论】:

  • 谢谢马克,这个答案也很好,因为它很简洁。
  • Vincent Russo - 是的 flatten() 返回列而不是行,因为默认情况下 NumPy 使用行顺序,而 MATLAB 使用列顺序,这是使用 MATLAB 学习 NumPy 时的重要区别。因此,如果您想模仿 MATLAB 的列顺序数组,您最终会大量使用reshape(),但如果您将范例转换为行顺序,则可以使用更简单(恕我直言,更 Pythonic)的代码获得完全相同的结果。 ;-)
  • 一个非常好的事情要注意,感谢马克指出这一点,这是一个很好的观点。再次感谢您的帮助:)
【解决方案3】:

对于一维结果,请使用X.T.ravel() 或X.T.flatten()。对于二维列,请使用X.T.reshape(-1,1)。

【讨论】:

  • +1 用于使用 flatten(),因为它与 MATLAB 的线性索引 EG 最相似:a(:),但我认为 @jonrsharpe 使用 order='F' 比转置更好,因为它明确从 NumPy 的 row-order 更改为 MATLAB(和 Fortran 的)column-order,这是新用户应该了解的 MATLAB 和 NumPy 的根本区别
猜你喜欢
  • 2016-08-26
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-22
  • 2015-01-29
相关资源
最近更新 更多