我写了一个函数来查看矩阵是否对称:
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矩阵的一个特定单元的正确方法是什么?
答案 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
。