【问题标题】:TypeError: only length-1 arrays can be converted to Python scalars (for loop)TypeError:只有长度为 1 的数组可以转换为 Python 标量(for 循环)
【发布时间】: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] = ...)?

标签: python numpy


【解决方案1】:

其他人指出你的意思很可能是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 &lt;= xa 中的先前条件。只是想我会指出它,以防它真的很重要。

【讨论】:

    猜你喜欢
    • 2014-09-27
    • 2013-03-15
    • 1970-01-01
    • 2016-08-06
    • 2018-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多