【发布时间】:2014-08-04 13:14:25
【问题描述】:
我正在尝试编写矩形渠道中的溃坝的分析解决方案。想法是在大坝一侧 4m 处有水,大坝下游侧没有水,然后拆除大坝,看看水随着时间的推移如何演变。我有以下代码,但我遇到了“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 行,在 对于范围(x)中的 i: TypeError: 只有长度为 1 的数组可以转换为 Python 标量
当我读取文本文件时,代码的后半部分工作正常。我相信它只是 for 循环和 if 语句有问题,但我可能是错的。谢谢你的帮助。
【问题讨论】:
-
for i in range(x)没有意义 -x是一个数组。你的意思是range(len(x))? -
for i in range(x): x 是一个数组。我认为您的意思是 i in range(len(x))
-
另一种可能性是直接循环
x,即for x_item in x -
啊,好吧,是的,这已经解决了。但是,当我尝试打印 h 的长度以检查我的数组中是否有正确数量的值时,我得到了一个新错误。 print len(h) TypeError: object of type 'numpy.float64' has no len() 任何想法为什么它只给我一个 h 值?
-
您将
h初始化为与x长度相同的零数组,但随后您将在for循环中为h分配一个标量值。你的意思是h是一个标量还是一个向量?也许您打算在for循环中分配h的元素(例如h[i] = ...)?