读取numpy矩阵的一个特定单元格

时间:2015-11-01 21:42:07

标签: arrays numpy matrix

我写了一个函数来查看矩阵是否对称:

def issymmetric(mat):
    if(mat.shape[0]!=mat.shape[1]):
        return 0
    for i in range(mat.shape[0]):
        for j in range(i):
            if (mat[i][j]!=mat[j][i]):
                return 0
    return 1

它适用于内置的ndarrays,例如numpy.ones:

import numpy as np
a=np.ones((5,5), int)
print issymmetric(a)

使用numpy数组:

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

但是当谈到numpy矩阵时:

import numpy as np
a=np.matrix([[1, 2, 3], [2, 1 , 2], [3, 2, 1]])
print issymmetric(a)

它给了我这个错误:

  File "issymetry.py", line 9, in issymmetric
    if (mat[i][j]!=mat[j][i]):
  File "/usr/lib/python2.7/dist-packages/numpy/matrixlib/defmatrix.py", line 316, in __getitem__
    out = N.ndarray.__getitem__(self, index)
IndexError: index 1 is out of bounds for axis 0 with size 1

shell returned 1

那是因为没有[0] [1]

a[0]matrix([[1, 2, 3]])a[0][0]也是matrix([[1, 2, 3]]),但没有a[0][1]

如何在不更改矩阵类型或函数的情况下解决此问题?

一般来说,读取和更新numpy矩阵的一个特定单元的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

最好在[i,j]中使用numpy样式索引。在使用[i][j]时,您通常可以使用np.array,但不能使用np.matrix。请记住,np.matrix始终是2d。

在shell中构造一个简单的2d数组,并尝试不同的索引方法。现在尝试使用np.matrix数组。注意形状。

In [2]: A = np.arange(6).reshape(2,3)
In [3]: A[1]   # short for A[1,:]
Out[3]: array([3, 4, 5])    # shape (3,)
In [4]: A[1][2]   # short for A[1,:][2]
Out[4]: 5
In [5]: M=np.matrix(A)
In [6]: M[1]
Out[6]: matrix([[3, 4, 5]])   # shape (1,3), 2d
In [7]: M[1][2]
...
IndexError: index 2 is out of bounds for axis 0 with size 1

正确的索引适用于

In [9]: A[1,2]
Out[9]: 5
In [10]: M[1,2]
Out[10]: 5
在LHS上使用时,

A[i][j]=...也容易出现故障。它仅在第一部分A[i]返回view时有效。如果失败则产生copy