类型错误:仅长度为1的数组可以转换为Python标量(for循环)
我正在尝试编写一个分析解决方案,用于研究一个矩形渠道中的大坝溃坝情况。我的想法是,在大坝的一侧有4米深的水,而在大坝的下游没有水。然后我会移除大坝,看看水会随着时间的推移如何变化。我有以下代码,但在“for i in range (x):”这一行遇到了问题。我会把我的代码和我遇到的错误贴出来。有人能解释一下我为什么会得到这个错误,以及可能的解决方案吗?谢谢
__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()
当我运行这段代码时,出现了这个错误: 追踪(最近的调用最后): 文件 "D:\Work\NetBeansProjects\Ritter_test_2\src\ritter_test_2.py",第29行, for i in range(x): 类型错误:只能将长度为1的数组转换为Python标量
代码的后半部分在读取文本文件时运行正常。我认为只是for循环和if语句有问题,但我可能错了。感谢任何帮助。
1 个回答
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
条件就已经满足了。我只是想提醒一下,如果这点很重要的话。