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 中,当我们使用两个列表时,我们可能想要使用zip()itertools.izip()获取值,但在这种情况下,您正在使用两个索引值重写一个数组,我认为以上述方式编写它可能是最好的。当然是最简单的了。

请注意,我们不需要测试是否matriztiempo[x,y]等于零;如果是,那么任何有效除数的结果都将为零。我们需要检查除数是否有效以避免被零除异常。(我们也可以放置一个try:/except块来捕捉这种情况,如果零是一个不太可能的值matrizvelocidades。如果它是一个可能的值,这是一个好方法。

编辑:但是由于这是 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_mask将会numpy.logical_not()找到正确的逆,但如果我们只有第二个表达式引用matrizvelocidades,那么编辑一个但不编辑另一个会引入错误。

于 2013-06-13T20:10:46.533 回答