类型错误:仅长度为1的数组可以转换为Python标量(for循环)

0 投票
1 回答
4600 浏览
提问于 2025-04-18 15:55

我正在尝试编写一个分析解决方案,用于研究一个矩形渠道中的大坝溃坝情况。我的想法是,在大坝的一侧有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 条件就已经满足了。我只是想提醒一下,如果这点很重要的话。

撰写回答