如何忽略-inf并移至for循环中的下一个迭代

Posted

技术标签:

【中文标题】如何忽略-inf并移至for循环中的下一个迭代【英文标题】:How to disregard -inf and move to next iteration in for loop 【发布时间】:2015-01-10 00:18:44 【问题描述】:

您好,我希望得到一些帮助

import numpy as np
import math
import matplotlib.pylab as plt
import pandas as pd
from scipy.interpolate import interp1d
from scipy.signal import butter, filtfilt
from scipy import interpolate
Ic = 400
lower_Ig = 720 #the lower limit of the generator current Ig
Upper_Ig = 1040 #Upper limit
Ix=range(-60,61,1)
for j in range(40, 80, 10):
    Var=(40000* j)/ 10000
    #print Var
    for c in range(lower_Ig, Upper_Ig+1, 40):
        #print c
        Names =['Vg','V3', 'V4']
        Data = pd.read_csv('/Documents/JTL_'+str(Var)+'/Ig='+str(c)+'/Grey_Zone.csv', names=Names)
        Vg = Data['Vg']
        V3 = Data['V3']
        V4 = Data ['V4']
        Prf = V4 / Vg
        #print Prf
        C = 0.802
        freq = 100
        b, a = butter(2, (5/C)/(freq/2), btype = 'low')
        yg = filtfilt(b, a, Vg)  # filter with phase shift correction
        y4 = filtfilt(b, a, V4)  # filter with phase shift correction
        SW = y4 / yg
        if SW == np.nan: #I need a condition here that if -inf is encountered then the programme should loop to next c value in for loop 
            continue 
            f = interp1d( SW, Ix )
            print f(0.25), f(0.5), f(0.75)
            print f(0.75)-f(0.25)

我尝试使用不同的 numpy 函数,但总是遇到同样的错误

The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

我认为我不能使用any()all(),因为这将只包含所有数据,我想忽略-inf。非常感谢任何帮助

【问题讨论】:

哪一行给出了这个错误? @rpattiso if SW == np.nan 导致错误 为什么使用anyall 会包含所有数据?它会将它们包含在什么中? @rpattiso 根据我对文档 all 的理解返回整个数组,而不评估数组中的任何内容,并且不区分 -inf 或值,除非我有没有完全想明白?我想要的是检查任何 NaN 值,一旦遇到 NaN 值,文件将被忽略,循环继续进行下一次迭代,即下一个文件。 【参考方案1】:

假设我们在循环的一次迭代中有SW,如下所示:

>>> import numpy as np
>>> SW = [np.inf, -np.inf, np.nan, 0, 1]
>>> np.isfinite(SW)
[False, False, False, True, True]
>>> all(np.isfinite(SW))
False   # since one or more in the list is False

如果您想跳过任何具有nan, inf, -infSW,您可以使用

if not all(np.isfinite(SW)):
    continue

如果nan 没有问题,只有-inf 是,那么你可以使用

if any(np.isneginf(SW)):
   continue

如果SW 的任何元素是-inf,它将跳过迭代

请注意,您不能使用 ==np.nan 比较相等性

>>> x = np.nan
>>> x == np.nan
False

改为使用isnan

>>> np.isnan(x)
True

【讨论】:

【参考方案2】:

您可以filter 去掉不需要的元素(例如newlist=filter(lambda n: not numpy.isneginf(n), list_of_numbers)),或者使用numpy.nan_to_num(...) 转换为正确数字的列表。

【讨论】:

这不就是在循环中包含 -inf 而不是忽略它们吗?我也尝试将numpy.nan_to_num(...) 设置为SW = numpy.nan_to_num(SW),但是当我输入条件if SW > -1: 时,我得到与上面相同的错误The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 也许我误会了你;发生在哪里(如:在哪一行?)?如果是在if SW==numpy.nan这一行,那么你显然应该考虑警告的含义; SW 是一个数组,将一个数组与一个值进行比较将产生一个真值数组,而不是一个真值;因此,警告是绝对正确的,您应该指定是否要检查 any NaN 或 SW 的 all 值是否为 NaN。 这可能是因为我对 python 数组缺乏了解。我想要的是检查任何 NaN 值,一旦遇到 NaN 值,文件将被忽略,循环继续进行下一次迭代,即下一个文件。 好吧,然后测试“not any”

以上是关于如何忽略-inf并移至for循环中的下一个迭代的主要内容,如果未能解决你的问题,请参考以下文章

转到基于范围的 for 循环中的下一个迭代器

如果满足条件,则移动到嵌套 for 循环中的下一次迭代

迭代器协议和for循环工作机制

如何强制结束 for 循环的迭代(不停止 for 循环)?

迭代器和增强for循环

Python基础-----迭代器协议和For循环机制