1

配列のフロートに問題があります。

    import numpy
from StringIO import StringIO


matrizgeometrica = numpy.loadtxt('geometrica.txt')    # crea la matriz geometrica a partir del txt
matrizvelocidades = numpy.loadtxt('velocidades.txt')    # crea la matriz de velocidades a partir del txt

#Se genera la matriz de tiempos unitarios a partir de la matriz geometrica y la matriz de velocidades
matriztiempo=matrizgeometrica
for x in matriztiempo:
    for y in matriztiempo:
        if matriztiempo[x,y]!=0 and matrizvelocidades[x,y]!=0:
            matriztiempo[x,y]=matriztiempo[x,y]/matrizvelocidades[x,y]
        else:
            matriztiempo[x,y]=0

エラーはこれです:

Traceback (most recent call last):
  File "lpi2.py", line 12, in <module>
    if matriztiempo[x,y]!=0 and matrizvelocidades[x,y]!=0:
IndexError: arrays used as indices must be of integer (or boolean) type

何が問題なのかわかりませんが、値を整数に変更することはできません。浮動小数点数が必要です。

4

1 に答える 1

4

これはあなたのループです:

for x in matriztiempo:

これはx、配列の値に設定されます。これは値の位置を見つけません。値を取得するだけです。

位置を知りたい場合は、次のenumerate()ように使用するのが最善の方法です。

for i, x in enumerate(matriztiempo):

x以前と同じように値を取得するようになりましたが、リスト内のその値のインデックスも取得iします。

あなたの場合、次のようにループを書くのが最も簡単だと思います:

for x in xrange(matriztiempo.shape[0]):
    for y in xrange(matriztiempo.shape[1]):
        if matrizvelocidades[x,y] != 0:
            matriztiempo[x,y] /= matrizvelocidades[x,y]
        else:
            matriztiempo[x,y] = 0

通常、Python では 2 つのリストを操作するときに値を使用zip()またはitertools.izip()取得したい場合がありますが、この場合は 2 つのインデックス値を使用してその場で配列を書き換えているため、上記の方法で記述するのが最善であると思います。確かに一番簡単です。

matriztiempo[x,y]ゼロに等しいかどうかをテストする必要がないことに注意してください。そうである場合、有効な除数の結果はゼロになります。ゼロ除算の例外を回避するために、除数が有効であることを確認する必要があります。(でゼロがありそうもない値である場合、このケースをキャッチするためにtry:/ブロックを配置することもできます。それがありそうな値である場合、これは良い方法です。exceptmatrizvelocidades

編集:しかし、これはNumPyであるため、これを行うためのより良い方法があり、はるかに高速です。除数のゼロについて心配する必要がない場合は、次のようにするだけです。

matriztiempo /= matrizvelocidades

ゼロについて心配する必要があるため、これを解決するための「マスク」を作成できます。

good_mask = (matrizvelocidades != 0)
bad_mask = numpy.logical_not(good_mask)

matriztiempo[good_mask] /= matrizvelocidades[good_mask]
matriztiempo[bad_mask] = 0.0

forこれは、ループを使用したソリューションよりもはるかに高速です。

次のようにすることもできますbad_mask

bad_mask = (matrizvelocidades == 0)

しかし、明示的に計算numpy.logical_not()することにより、bad_maskが常に の正しい論理的逆であることを確認しますgood_mask。誰かが を作成する行を編集するとgood_masknumpy.logical_not()は正しい反転を見つけますが、一方を参照する 2 つ目の式がある場合matrizvelocidades、一方を編集してもう一方を編集しないと、バグが発生します。

于 2013-06-13T20:10:46.533 に答える