2016-10-16 18 views
0

男3次元配列を取得し、空のセルの数を確認する関数を作成しようとしています。 は、しかし、私はその私がここに で働いている大規模なモジュールからはそれTypeError: 'float'オブジェクトは3次元配列の添え字ではありません

と連携機能である

def checkpoint(m, i, j): 
    c = 0 
    if m[i][j][0] == 0: 
     c += 1.0 
    if m[i][j][1] == 0: 
     c += 1.0 
    if m[i][j][2] == 0: 
     c += 1.0 
    if m[i][j][3] == 0: 
     c += 1.0 
return c 

以下のよう

in checkpoint 
if m[i][j][0] == 0: 
TypeError: 'float' object is not subscriptable 

私の関数である、次のエラーを得ます

def check(m, size): 
flag = 2 
for i in range(size): 
    for j in range(size): 
     print(i, j, "/n") 
     c = checkpoint(m, i, j) 
     s = summ(m, i, j) 
     if c == 2: 
      if s == 2 or -2: 
       flag = 1.0 
       if m[i][j][0] == 0: 
        if m[i][j][1] == 0: 
         m[i][j][0] = m[i][j][1] = (-s/2) 
         fix(m, i, j, 0, size) 
         fix(m, i, j, 1, size) 
        elif m[i][j][2] == 0: 
         m[i][j][0] = m[i][j][2] = (-s/2) 
         fix(m, i, j, 0, size) 
         fix(m, i, j, 2, size) 
        else: 
         m[i][j][0] = m[i][j][3] = (-s/2) 
         fix(m, i, j, 0, size) 
         fix(m, i, j, 3, size) 
       elif m[i][j][1] == 0: 
        if m[i][j][2] == 0: 
         m[i][j][1] = m[i][j][2] = (-s/2) 
         fix(m, i, j, 1, size) 
         fix(m, i, j, 2, size) 
        elif m[i][j][3] == 0: 
         m[i][j][1] = m[i][j][3] = (-s/2) 
         fix(m, i, j, 1, size) 
         fix(m, i, j, 3, size) 
       else: 
        m[i][j][2] = m[i][j][3] = (-s/2) 
     if c == 3: 
      flag = 1.0 
      if m[i][j][0] == 0: 
       m[i][j][0] = -s 
      elif m[i][j][1] == 0: 
       m[i][j][1] = -s 
      elif m[i][j][2] == 0: 
       m[i][j][2] = -s 
      else: 
       m[i][j][3] = -s 
return m, flag 

任意のコメントをいただければ幸いです。

update:

私は必然的にモジュールの中で関数を実行しています。チェック機能でiとjの最初の反復と2回目の繰り返しは問題ありません。それ以降はエラーに直面するでしょう。 the output of the code that I'm trying to run

あなたはそれがチェック機能で私の最初の繰り返しで問題ありませんでした見ることができるよう:

は、ここに私の出力です。
ここは私の修正機能です。それは、ちょうど変更されたセルの矢印に関して、他のいくつかのセルを変更します。ここ

def fix(m, i, j, k, size): 
ip = i - 1 
jp = j - 1 
iz = i + 1 
jz = j + 1 
if ip < 0: 
    ip = size - 1 
if jp < 0: 
    jp = size - 1 
if iz > size - 1: 
    iz = 0 
if jz > size - 1: 
    jz = 0 
kp = (k+2) % 4 
if k == 0: 
    m[i][jz][kp] = -1 * m[i][j][k] 
if k == 1: 
    m[iz][j][kp] = -1 * m[i][j][k] 
if k == 2: 
    m[i][jp][kp] = -1 * m[i][j][k] 
if k == 3: 
    m[ip][j][kp] = -1 * m[i][j][k] 
return m 

あなたは、全体のパッケージを見つけることができますメートルを意味 my code

+0

を説明するよう

「コンテナ」は、あなたが扱っているデータの有効なサンプルを提示してください「スクリプト可能」です。どのように正確にあなたの方法を呼びますか? – idjaw

+0

私は質問を更新しました –

+0

例外トレースバックは、例外が実際に表示されたコードの部分ではなく、 'checkpoint'関数で実際に起こっていることを示しています。いずれにしても、特定のエラーはおそらく、あなたの 'm'データ構造がどこかでうんざりしていることを意味しています(内側のリストを期待する浮動小数点があります)。有効な代入は表示されている 'check'関数内でしか見られないので、エラーは他のどこかにある必要があります(例えば、' fix'の中で、あるいは 'checkpoint'のある部分で多分呼び出されます)。もっとコードを投稿する必要があるかもしれません!また、スクリーンショットではなく、テキストとしてトレースバックを投稿してください。 – Blckknght

答えて

0

が実際に3Dの配列ではありませんが、コードがfloat[i]または[i][j]または[i][j][0]をやろうとしています。 here

+0

だから私は私の配列を作成する方法を変更する必要がありますか?何か提案がありますか? –

+0

numpyで配列を使用したくないと、計算時間が長くなります。 –

+0

どのようにmを初期化するのかは分かりませんが、numpyは2次元配列(またはそれ以上の次元)を作成するリストのpythonリストより効率的で高速です。ここの比較の詳細:http://stackoverflow.com/questions/993984/why-numpy-instead-of-python-lists – bits

関連する問題