在pylab矩阵中交换行

时间:2014-02-02 16:23:41

标签: python numpy matplotlib

我想交换2行pylab矩阵a。但是,当使用[0],a [1] = a [1],a [0]时,它不起作用:

>>> from pylab import *
>>> a = matrix([ [1.,2.] , [3.,4.] ])
>>> print a
  [[ 1.  2.]
  [ 3.  4.]]
>>> a[0],a[1] = a[1],a[0]
>>> print a
  [[ 3.  4.]
  [ 3.  4.]]

如何正确交换行?

谢谢!

3 个答案:

答案 0 :(得分:3)

a[[1,0]]获取第2行,然后是第1行,如果您想要回写:

In [842]: a[[0,1]]=a[[1,0]]

In [843]: a
Out[843]: 
matrix([[ 3.,  4.],
        [ 1.,  2.]])

或使其成为一种功能:

In [848]: def swapMatRow(mat, r1, r2):
     ...:     mat[[r1,r2]]=mat[[r2, r1]]
     ...:     

In [850]: a = np.matrix([ [1.,2.] , [3.,4.] ])

In [851]: swapMatRow(a, 0, 1)

In [852]: a
Out[852]: 
matrix([[ 3.,  4.],
        [ 1.,  2.]])

答案 1 :(得分:3)

索引/切片返回数组的视图,交换项目可以使用包含其中一行副本的临时变量:

>>> a = np.matrix([ [1.,2.] , [3.,4.] ])
>>> temp = a[0].copy()  #New copy of a[0]
>>> a[0], a[1] = a[1], temp
>>> a
matrix([[ 3.,  4.],
        [ 1.,  2.]])

简单的a[0], a[1] = a[1], a[0]不起作用,因为NumPy不返回项本身,而是返回数组项的视图。因此,一旦第一个作业a[0] <-- a[1]完成,我们实际上也改变了另一个项a[0](在RHS上),因此下一个作业a[1] <-- a[0]只会导致复制新a[0]a[1],因此我们重复了a[1]次。

答案 2 :(得分:0)

您也可以撤消行:

In [125]: a = a[::-1]

In [126]: a
Out[126]: 
matrix([[ 3.,  4.],
        [ 1.,  2.]])