【问题标题】:Finding the index of items cotaining 'inf' or 'nan'查找包含“inf”或“nan”的项目的索引
【发布时间】:2018-07-13 13:22:01
【问题描述】:

以下是我列表中1 项 的示例:

array([[  1,   2,   3,
          43,   83,   92],
       [  12,   54,   93,
          23,   94,   83],
       [  23,   inf,   inf,
          inf,   inf,   inf],
       [  83,   33,   33,
          83,   13,   83],
       [  83,   nan,   83,
          73,   43,   43],
       [  43,   83,   93,
          22,   83,   54],
       [  66,   nan,   74,
          84,   84,   75],
       [  74,   44,   65,
          6,   9,   7],
       [  54,   9,   74,
          754,   55,   74]])

其中一些项目包含infnan 值。因此,我试图返回包含此类值的项目的索引。因此,我尝试执行以下操作:

for x in f:
    if float('inf') in x:
        idx.append(f.index(x))
    elif float('nan') in x:
        idx.append(f.index(x))

但是,当我运行我的脚本时,我收到以下错误:

idx.append(f.index(x))
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

这是为什么呢?我该如何解决这个问题?

作为提醒,以上示例仅为1 项。由于它包含infnan,我想返回该项目的索引。该项目基本上是一个列表列表。

谢谢。

【问题讨论】:

  • 此数据没有任何无穷大或 nans。您能否添加一个具有预期输出的样本?你可以使用np.isfinite
  • 什么是 f?什么是 idx?如果我没记错的话,这个错误与 inf 或 nan 无关...stackoverflow.com/questions/12647471/…
  • @cᴏʟᴅsᴘᴇᴇᴅ 我对我的数据进行了编辑以显示示例
  • @Astrom "f" 是简单的包含数据的列表的名称,而 "idx" 是一个列表,我想在其中添加包含 "inf" 或 "nan" 的项目的索引
  • 接受的答案不是很好,因为您根本不需要列表理解。您可以 100% 将其矢量化。但是,如果您不显示预期的输出,我无法写答案。

标签: python list numpy indexing


【解决方案1】:

按照@coldspeed 的建议,您可以获得包含infs 或nans 的元素索引

idx = [i for i, arr in enumerate(f) if not np.isfinite(arr).all()]

来自idx.append(f.index(x)) 的问题会导致您的错误。如果xf 的第一个元素,它将返回True,否则抛出错误。如果您设置f[0] = x.copy() 并尝试检查x in f,它也会抛出错误。两者都是因为bool(x == x) 定义不明确。

【讨论】:

    【解决方案2】:

    在 Python 中像 Item 这样打印出来的东西应该是 numpy array

    如 cᴏʟᴅsᴘᴇᴇᴅ 所述,numpy 中的处理效率最高

    将打印输出 'array' inf, nan 放入 np 对象中,并将 'array' 放入 np.array:

    import numpy as np
    inf, nan = np.inf, np.nan  
    
    a = np.array([[  1,   2,   3,
              43,   83,   92],
           [  12,   54,   93,
              23,   94,   83],
           [  23,   inf,   inf,
              inf,   inf,   inf],
           [  83,   33,   33,
              83,   13,   83],
           [  83,   nan,   83,
              73,   43,   43],
           [  43,   83,   93,
              22,   83,   54],
           [  66,   nan,   74,
              84,   84,   75],
           [  74,   44,   65,
              6,   9,   7],
           [  54,   9,   74,
              754,   55,   74]])
    

    那么有 numpy 函数只用于此类操作

    a_infs = np.where(np.isinf(a))
    
    a_infs
    Out[170]: (array([2, 2, 2, 2, 2], dtype=int64), array([1, 2, 3, 4, 5], dtype=int64))
    
    a[a_infs]
    Out[171]: array([ inf,  inf,  inf,  inf,  inf])
    
    a_nans = np.where(np.isnan(a))
    
    a_nans
    Out[173]: (array([4, 6], dtype=int64), array([1, 1], dtype=int64))
    
    a[a_nans]
    Out[174]: array([ nan,  nan])
    

    两者可以结合

    a_bads = tuple(np.hstack((a_infs, a_nans)))
    
    a[a_bads]
    Out[184]: array([ inf,  inf,  inf,  inf,  inf,  nan,  nan])
    
    a_bads
    Out[185]: 
    (array([2, 2, 2, 2, 2, 4, 6], dtype=int64),
     array([1, 2, 3, 4, 5, 1, 1], dtype=int64))
    

    或被转换为list并被操纵

    a_infs = np.array(a_infs).tolist()
    
    a_infs    
    Out[175]: [[2, 2, 2, 2, 2], [1, 2, 3, 4, 5]]
    
    [*zip(*a_infs)]
    Out[176]: [(2, 1), (2, 2), (2, 3), (2, 4), (2, 5)]
    

    【讨论】:

      猜你喜欢
      • 2018-06-30
      • 2019-10-31
      • 2020-07-24
      • 2019-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-26
      • 2010-09-15
      相关资源
      最近更新 更多