gpt4 book ai didi

python - Python 上的数组与 numpy

转载 作者:太空宇宙 更新时间:2023-11-04 10:46:11 24 4
gpt4 key购买 nike

我的阵列上的 float 有问题。

    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

我不知道问题出在哪里,但我无法将值更改为整数,我需要 float 。

最佳答案

这是你的循环:

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 block 来捕捉这种情况,如果零是 matrizvelocidades 中不太可能的值。如果它是可能的值(value),这是一个很好的方法。

编辑:但由于这是 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 然后编辑一个而不编辑另一个会引入错误。

关于python - Python 上的数组与 numpy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17095958/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com