TypeError:只能将length-1数组转换为Python标量(for循环)

时间:2014-08-04 13:14:25

标签: python numpy

我正在尝试将分析解决方案编码为矩形通道中的溃坝。我们的想法是在大坝的一侧有4米的水,在大坝的下游侧没有水,然后拆除大坝,看看水是如何随时间演变的。我有以下代码,但我在"对于范围(x)中的i有问题:"线。我将粘贴我的代码和我得到的错误。谁能解释为什么我会得到这个错误和任何可能的解决方案?谢谢

    __author__="A.H"
__date__ ="$04-Aug-2014 13:46:59$"

import numpy as np
import matplotlib.pyplot as plt 
import math 
import sys
from math import sqrt  
import decimal

nx, ny = (69,69)
x5 = np.linspace(0,20.1,nx)
y5 = np.linspace(0,20.1,ny)
xv,yv = np.meshgrid(x5,y5)
x = np.arange(0,20.3956,0.2956)
y = np.arange(0,20.3956,0.2956)
t59=np.arange (1,4761,1)


h0=4.0
g=9.81
t=1
xa=10.5-(t*math.sqrt(g*h0))
xb=10.5+(2*t*math.sqrt(g*h0))


h=np.zeros(len(x))

for i in range(x):
   if x[i]<=xa:
      h=h0
   elif xa<=x[i]<=xb:
      h=(4.0/(9.0*g))*(((math.sqrt(g*h0))-(x[i]/(2.0*t)))**2.0)
   else:
      h=0

f = open(r'C:\opentelemac\bluetang\examples\telemac2d\dambreak\D1.i3s', 'r')
while True:
   line = f.readline()
   if line[0] not in [':','#']: break
ran = int(line.split()[0])
length = np.zeros(ran)
wse =  np.zeros(ran)
for i in range (ran):
   fields = f.readline().split()
   length[i] = float(fields[0])
   wse[i] = float(fields[2])
   all =[length[i],wse[i]]


plt.figure(2)
plt.plot(length,h)
plt.plot(length,wse)
plt.legend(['Analytical solution','Model'], loc='upper right')
plt.show()

当我运行此代码时,我收到错误: Traceback(最近一次调用最后一次):   文件&#34; D:\ Work \ NetBeansProjects \ Ritter_test_2 \ src \ ritter_test_2.py&#34;,第29行,在     对于范围(x)中的i: TypeError:只能将length-1数组转换为Python标量

当我读取文本文件时,代码的后半部分工作正常。我相信它只是for循环和if语句有问题,但我可能是错的。谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

其他人指出你最有可能是range(len(x))

只需迭代数组x中的项目,即可完成更简单的操作:

for value in x:
    if value <= xa:
        h = h0
    elif xa <= value <= xb:
        h = (4.0/(9.0*g))*(((math.sqrt(g*h0))-(value/(2.0*t)))**2.0)
    else:
        h = 0

elif中的条件也存在一个小问题 - 此处xa不能等于value,因为如果它已经满足了之前的if value <= xa {{1}}中的条件。只是想我会指出它,以防万一它真的很重要。