以下是我的列表中 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]])
其中一些项目包含inf
或nan
个值。因此,我试图返回包含此类值的项的索引。我因此尝试了以下操作:
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项。由于它包含inf
和nan
,因此我想返回该项的索引。该项基本上是一个列表列表。
感谢。
答案 0 :(得分:0)
根据@coldspeed的建议,您可以获得包含inf
或nan
s的元素索引
idx = [i for i, arr in enumerate(f) if not np.isfinite(arr).all()]
来自idx.append(f.index(x))
的问题会导致您的错误。如果True
是x
的第一个元素,它将返回f
,否则会抛出错误。如果您设置f[0] = x.copy()
并尝试检查x in f
,也会出错。两者都是因为bool(x == x)
没有明确定义。
答案 1 :(得分:0)
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)]