2017-03-17 6 views
1

行列が対称であるかどうかをテストする必要があります。対称型の場合、関数は0を返す必要があり、そうでない場合は1を返します。私にとって、このコードは理にかなっていますが、ポップアップしているエラーを理解できません。行列要素をループするときのインデックスエラー

IndexError        Traceback (most recent call last) 
<ipython-input-3-903eff7c516e> in <module>() 
    20 # here's the matrix I'm testing : 
    21 
---> 22 isSymmetric(np.matrix(([(1,0,0),(5,6,5),(8,0,1)]))) 

<ipython-input-3-903eff7c516e> in isSymmetric(A) 
    10  i=0 
    11  for i in np.matrix(A) : 
---> 12   m = A[i] 
    13   n = A[:,i] 
    14   if m==n : 

/usr/local/lib/python2.7/site-packages/numpy/matrixlib/defmatrix.pyc in __getitem__(self, index) 
    316 
    317   try: 
--> 318    out = N.ndarray.__getitem__(self, index) 
    319   finally: 
    320    self._getitem = False 

IndexError: index 5 is out of bounds for axis 0 with size 3 

は、ここに私のコードです:

import numpy as np 

def isSymmetric (A) : 
    """ 
    A : the matrix that will be checked if it's symmetric 

    """ 

    #check if rows are same as columns 
    i=0 
    for i in np.matrix(A) : 
     m = A[i] 
     n = A[:,i] 
     if m==n : 
      print(1) 
     else: 
      print(0) 


# here's the matrix I'm testing : 

isSymmetric(np.matrix(([(1,0,0),(5,6,5),(8,0,1)]))) 
+1

http://stackoverflow.com/questions/5320324/testing-if-a-numpy-array-is-symmetric – ewcz

+0

コードが間違ってインデントされています。修正してください。 – Morgoth

+0

イメージを使用する代わりに、エラーメッセージをコピーして質問に貼り付けてください。それはより読みやすくなります。 – Cecilia

答えて

2

正直に言うと、あなたのコードで間違ったことの束があります。

i=0 
for i in np.matrix(A) : 

これは意味がありません。警告が表示される理由は次のとおりです。 for i in containerは、コンテナ内のすべての物と連続して同じ値に設定してループします(i)。この場合、コンテナはnp.matrix(A)なので、配列内のすべての実際のアイテムをループしています。明らかに、これらをインデックスとして使用すると意味がありません。インデックスをループする場合は、次のようなものが必要です。

M = np.matrix(A) 
for i in range(M.shape[0]): 

これは、マトリックスの最初のインデックスのすべての可能な値をループします。

def is_symmetric(M): 
    return (M == M.transpose()).all() 
+0

ありがとう、私は初心者のプログラマーですので、私は実際に何をやっているのか分かりません。また、より簡潔なコードを試してみましたが、エラー "AttributeError: 'list'オブジェクトに属性がありません。 – Katey

+0

@Kateyええ、 'transpose'は行列のメソッドなので、その関数に行列を渡す必要があります。あなたのコードでは、ループを実行するたびに 'A'を行列に変換していましたが、これは非常に非効率的です。 'A 'を行列に変換し、必要に応じて変数(例えば' M')に格納してループを実行する方が良いでしょう。 – Denziloe

+0

@Kateyところで、あなたが問題を理解するのに役立ちましたら、この回答を受け入れてください。 – Denziloe

0

テスト:ところで

は、これを行うために多くの滑らかな印象の方法、すなわち(M)を移調= M.あなたはとしてPythonでこれを行うことができ、対称行列の簡潔な定義を使用することです行列が対称であるならば、np.all(A == A.T)のようなもので行われます。 A.Tは転置行列を与え、==チェックは、すべての要素のために、あなたの行列が対称である場合は、最終的に知ることができます==np.allTrueを得ればそう確認し、要素ごとをequlity。

しかし、浮動小数点を使って作業している場合は、ある程度の公差を導入すると便利です。 ==には公差ゼロがあり、浮動小数点を扱う際に必ずしも良いとは限りません。代わりにnp.allclose(A, A.T)をここで使用できます。

これらのメソッドは、TrueまたはFalseのいずれかを返します。 10を付けたい場合は、1 * <return value of np.all or np.allclose>を返すことができます。

関連する問題