只是好奇NumPy功能的结果!

时间:2009-11-12 18:52:47

标签: python matlab numpy

我使用NumPy作为硕士论文。我已经从MATLAB代码中转换了部分代码,但是当我参考时,我对NumPy / Python有疑问:

m = numpy.ones((10,2))
m[:,0]

返回:

array([ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.])

当我参考:

m[:,0:1]

它返回:

array([[ 1.],
       [ 1.],
       [ 1.],
       [ 1.],
       [ 1.],
       [ 1.],
       [ 1.],
       [ 1.],
       [ 1.],
       [ 1.]])

我认为它应该是,与MATLAB相同的结果!!!

3 个答案:

答案 0 :(得分:5)

这是因为numpy具有Matlab没有的1d数组的概念。与numpys broadcasting相结合,这提供了一个强大的简化(更少担心在任何地方插入转置),但这意味着您必须考虑从Matlab进行翻译。在这种情况下,使用标量Numpy提取单个列会将结果简化为1d数组 - 但是使用切片它会保留原始尺寸。如果你想更接近Matlab语义,你可以尝试使用Matrix类。有关详细信息,请参阅NumPy for matlab users页面。在这种情况下,您可以执行以下任一操作:

m[:,0][:,newaxis] # gives same as matlab
np.matrix(m)[:,0] # gives same as matlab

但请记住,如果使用矩阵类*成为矩阵乘法,则需要使用multiply()进行元素化。 (这些都在NumPy for Matlab Users页面中介绍)。一般来说,我建议尝试习惯使用1d数组,你可以在matlab中使用列或行向量,一般情况下工作正常。在将它们重新组装成2d数组时,您只需要担心列与行。

您可能对自动matlab到python转换器感兴趣,例如OMPC (paper)(我认为还有其他转换器)。

答案 1 :(得分:3)

我自己仍在学习Python,但我认为切片的工作方式是索引指向中间位置,因此0:1只能获得第一列。这是你问的问题吗?

这是documentation所说的:

  

记住切片如何工作的一种方法   将指数视为指向   字符之间,左边缘   编号为0的第一个字符。   然后是最后一个右边缘   一串n个字符的字符   索引为n,例如:

 +---+---+---+---+---+
 | H | e | l | p | A |
 +---+---+---+---+---+
 0   1   2   3   4   5
-5  -4  -3  -2  -1

答案 2 :(得分:0)

我忘记了numpy的作用,但Matlab将向量索引为1,而不是0.因此,数组(:,0)是Matlab中的错误。