带有numpy的Python上的数组

2024-10-03 09:13:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我的数组上的浮点数有问题。在

    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

错误是:

^{pr2}$

我不知道问题出在哪里,但我不能把值改成整数,我需要浮点。在


Tags: importnumpytxtdelacreastringioloadtxt
1条回答
网友
1楼 · 发布于 2024-10-03 09:13:14

这是你的循环:

for x in matriztiempo:

这将把x设置为数组中的值。这不会找到值的位置;它只获取值。在

{你想知道的最好的方式是使用位置:

^{pr2}$

现在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()或{}来获取值,但是在这种情况下,您使用两个索引值重写了一个数组,我认为以上述方式编写它可能是最好的。当然,这是最简单的。在

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

编辑:但既然这是纽比,有一个更好的方法来做,快得多。如果我们不需要担心除数中的零,我们可以这样做:

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的行,numpy.logical_not()将找到正确的反向表达式,但是如果我们有第二个引用matrizvelocidades的表达式,那么编辑其中一个而不编辑另一个将导致错误。在

相关问题 更多 >