2015-11-01 3 views
0

Я написал функцию, чтобы увидеть, если матрица симметрична или нет:Прочитайте одну конкретную ячейку Numpy матрицы

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

Лучше всего использовать [i,j] индексирование стиля в numpy. Часто вы можете получить [i][j] при использовании np.array, но не с np.matrix. Помните, что np.matrix всегда 2d.

В оболочке построить простой 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 

A[i][j]=... также может привести к неудачам при использовании на LHS. Он работает только в том случае, если первая часть A[i] возвращает view. Если сбой, если он производит copy.

Смежные вопросы