查找包含'inf'或'nan'的项目索引

时间:2018-02-03 00:54:39

标签: python list numpy indexing

以下是我的列表中 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,因此我想返回该项的索引。该项基本上是一个列表列表。

感谢。

2 个答案:

答案 0 :(得分:0)

根据@coldspeed的建议,您可以获得包含infnan s的元素索引

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

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

答案 1 :(得分:0)

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

,如cᴏʟᴅsᴘᴇᴇᴅ

所述,可以最有效地在numpy中进行处理

使打印输出'数组'inf,纳入np对象,将'数组'转换为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)]