我使用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相同的结果!!!
答案 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数组时,您只需要担心列与行。
答案 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中的错误。