如何在while循环中使用if,else语句从变量中读取一系列值进行计算
Posted
技术标签:
【中文标题】如何在while循环中使用if,else语句从变量中读取一系列值进行计算【英文标题】:How to use an if, else statement inside of a while loop that reads a series of values from a variable for calculations 【发布时间】:2021-05-14 12:23:59 【问题描述】:我对使用 python 非常陌生,我正在尝试对一个方程进行计算。我需要执行 6 次计算,输入数据是系列的形式(例如,变量 wi
包含一系列 6 个值)。所讨论的等式有两种不同的形式,1 如果wi
小于或等于 0.49,则采用 A 形式,如果 wi
大于 .49,则采用 B 形式。
我试图使用 while 循环通过嵌入的 if-else
语句来完成必要的计算,以便在每次迭代时采用正确的方程形式。我试图将结果放入的变量是aai
,我为它创建了一个数组,并用零作为占位符。我在尝试运行代码时收到错误 "The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()"
。我的代码粘贴在下面。是否可以这样做或者我是否需要单独写出每个变量(例如wi = (0,1,2....)
到 wi0=0
、wi1=1
、wi2=2
并为每个变量创建多个循环?感谢您的所有时间并在这件事上提供帮助。真诚的,杰斯
import numpy as np
import pandas as pd
f = pd.read_excel (r"C:\Users\jmmar\Documents\PNG480MAT.xlsx")
#ex = pd.DataFrame(e)
t = 200
R= 10.73
mw = f.iloc[0,:]
tci = f.iloc[1,:]
pci = f.iloc[2,:]
zci= f.iloc[3,:]
wi = f.iloc[4,:]
omai = f.iloc[5,:]
ombi = f.iloc[6,:]
tri = t/tci
n=0
aai = np.zeros(6)
while n<7 :
if wi.le(wi,.49) :
fwi = .374640+1.54226*wi-.26992*wi**2
n+1
else :
fwi = .379642+1.48503*wi-.164423*wi**2+.016666*wi**3
aai = omai*(((R**2)*(tci**2))/pci)*((1+(fwi*(1-(tri**.5))))**2)
n+1
#bi = ombi*((R*tci)/pci)
print(aai)
【问题讨论】:
错字:n+1
应该是 n += 1
或 n = n + 1
为什么不在循环内使用n
?
我对编码和 python 非常陌生,并没有意识到我犯了这些错误。谢谢指点,以后会注意的!
因为你总是递增n,它可以是range
【参考方案1】:
使用带有range()
的for
循环而不是while
。像这样的东西应该可以工作:
for n in range(7) :
if wi[n] <= .49 :
fwi = .374640+1.54226*wi[n]-.26992*wi[n]**2
else :
fwi = .379642+1.48503*wi[n]-.164423*wi[n]**2+.016666*wi[n]**3
aai[n] = omai[n]*(((R**2)*(tci[n]**2))/pci[n])*((1+(fwi*(1-(tri[n]**.5))))**2)
【讨论】:
这比我以前尝试做的更接近,而且效率更高。唯一的问题是,当它运行时,aai 的新系列中的第一个值是 NAN,而不是它应该是的值。据我所知,NAN 是数据未对齐的时候。有任何解决这个问题的方法吗?感谢您的所有帮助,真的很感激! 嗯,这很奇怪...range(7)
应该为您的循环生成 n= 0,1,2,3,4,5,6
的值。你确定你在某处没有n=n+1
(或n+=1
)?
我在上面的 tri=t/tci 下有一个 n=1,但我已将其取出并尝试在 n = 0 且根本没有 n 的情况下运行它,它仍然重现相同的结果 NaN在未命名的 0 处应该有一个值
这是一个比较简单的代码块。问题可能出在tri[n]
返回 NAN 的平方根上吗?或者,另一个变量会导致问题?鉴于少数几个值,添加打印语句可能是最简单的:if wi[n]
上方的 1 个检查:print(n, wi[n], omai[n], tci[n], pci[n], tri[n])
,aai[n]=
上方的 1 个检查:print(fwi)
,然后一个检查:print(aai[n])
。跨度>
打印所有变量和 tri**.5 后,在对 tri[n] 求平方根时出现错误。那是第一次发生 NaN 错误的地方。我曾尝试使用math.sqrt
,但这会产生错误,因此我切换到.pow()
函数,每个print()
都会出现语法错误。我不知道如何解决这个问题,但我会继续努力!还有其他对平方根有用的函数吗?【参考方案2】:
TL;DR:请参阅下面的“实际解决方案”。 但首先,解决代码中的每个问题:
如果wi
是一系列数字,您不需要硬编码它需要运行循环 7 次。您可以只遍历 wi
的值。
在循环内直接分配给aai
会覆盖现有的aai
,它不再是np.zeroes()
数组。您可以将其初始化为常规的空 Python 列表并附加到它。并在循环结束时将其转换为数组。
aai = omai*...
赋值目前缩进到仅在 else
块内,但根据您的问题,它可能会出现在值小于或等于 0.49 或不小于的任何一种情况下。并且应该是append()
。
所以你的循环看起来像:
aai = [] # empty Python list
for val in wi:
if val <= .49:
fwi = .374640+1.54226*val-.26992*val**2
else:
fwi = .379642+1.48503*val-.164423*val**2+.016666*val**3
aai.append(omai*(((R**2)*(tci**2))/pci)*((1+(fwi*(1-(tri**.5))))**2))
aai = np.array(aai) # convert it to a numpy array if needed as a numpy array
另外,if-else
块可以简化为使用 Python 的三元运算符"Conditional expressions":
aai = []
for value in wi:
fwi = .374640+1.54226*val-.26992*val**2 if val <= .49 else .379642+1.48503*val-.164423*val**2+.016666*val**3
aai.append(omai*(((R**2)*(tci**2))/pci)*((1+(fwi*(1-(tri**.5))))**2))
aai = np.array(aai)
实际解决方案:
但是由于您使用的是 numpy 数组,因此您可以使用 np.where()
设置一个 fwi
值数组,该数组根据wi
中每个值的条件的真/假值分配值(任一公式)。然后一步计算aai
作为数组运算。不需要 for 循环、硬编码长度或 if-else。
# newlines added for readability
fwi = np.where(wi < 0.49,
.374640+1.54226*wi-.26992*wi**2,
.379642+1.48503*wi-.164423*wi**2+.016666*wi**3)
aai = omai*(((R**2)*(tci**2))/pci)*((1+(fwi*(1-(tri**.5))))**2) # becomes an array operation
【讨论】:
这帮助我理解了比几年前在 C++ 中学到的更好的循环方法。但是,我仍然将 NAN 放在应该有实际值的系列/数组的第一位。这是我的系列/数组对齐方式的问题,还是我应该手动将正确的值插入到发生 NAN 的位置?例如,一旦代码运行,aai 会显示未命名 0 的 NAN 值,但未命名 1 到 6 具有应有的正确值,因此我错过了应存在的未命名 0 中的值。 没错。 Python 循环(可以)迭代集合中的每个元素,这通常是想要的。 “按索引查找”方法也有效,但在 Python 中速度较慢(但在 numpy 中可能不是),通常是不必要的。至于什么不起作用,因为您的问题中没有 data,所以没有人能说出您为什么收到NaN
。在pd.read_excel()
行之后提供您的数据框样本f
。执行f.to_clipboard()
,然后将其粘贴到您的问题中。
欢迎来到 ***。了解如何提供Minimal, Reproducible Example 来帮助我们解决您的问题。看起来每个变量mw
、tci
、pci
、zci
、wi
、omai
、ombi
都是数据框的一行(来自 excel),包含所有列。那么它只有7行吗?将数据框内容添加到问题中。以上是关于如何在while循环中使用if,else语句从变量中读取一系列值进行计算的主要内容,如果未能解决你的问题,请参考以下文章