我有这样的矩阵:
print(sent_vectors[1])
[-1.17820399 0.46562683 -0.57934981 -0.78578004 -0.56564459 0.33715023
-0.56717469 0.82579453 0.52400108 -0.59714594 0.14502474 0.44333297
-0.71063957 -0.18717706 -0.47924724 -0.61488901 -0.19839954 -0.5482594
0.35703259 0.15601261 -0.15312789 0.08714889 0.83434086 -0.59783169
0.61747206 -0.16931582 0.13103572 0.1438039 -0.15157178 -1.2203296
0.31373093 0.89667472 -0.17520199 0.48635741 -0.11917028 -0.19563493
-0.59079649 1.08398885 0.23845113 0.75308501 -0.52543743 0.63864713
-1.28121311 -0.27246536 -0.40900175 -0.82675008 -0.60381615 0.88978195
NaN -0.56387159]
我的问题是如何找出矩阵是否包含NaN值? 如果它包含NaN值打印那个矩阵?请帮帮我。我这样尝试使用:
i=1;
for i in sent_vectors[i]:
a=sent_vectors[i]
np.where(np.isnan(a))
print(i)
i += 1
错误:列表索引必须是整数或切片,而不是numpy.float64
答案 0 :(得分:1)
听起来好像你有一长串数组,其中一些可能包含np.nan
。让我们做一个小测试用例:
In [617]: alist = [np.array([.1,.2,np.nan]), np.array([2,3,.2]), np.ones(3), np.zeros(3), np.array([np.nan,.1,2])]
In [618]: alist
Out[618]:
[array([0.1, 0.2, nan]),
array([2. , 3. , 0.2]),
array([1., 1., 1.]),
array([0., 0., 0.]),
array([nan, 0.1, 2. ])]
我们可以在其中一个数组中测试nan
:
In [619]: np.isnan(alist[0])
Out[619]: array([False, False, True])
我们可以遍历数组,并打印具有nan
:
In [620]: for i,a in enumerate(alist):
...: idx = np.where(np.isnan(a))[0]
...: if len(idx):print(i,idx)
...:
0 [2]
4 [0]
如果数组都具有相同的长度,我们可以将它们组合成一个2d数组:
In [621]: arr = np.stack(alist)
In [622]: arr
Out[622]:
array([[0.1, 0.2, nan],
[2. , 3. , 0.2],
[1. , 1. , 1. ],
[0. , 0. , 0. ],
[nan, 0.1, 2. ]])
In [623]: np.isnan(arr)
Out[623]:
array([[False, False, True],
[False, False, False],
[False, False, False],
[False, False, False],
[ True, False, False]])
In [624]: _.any(axis=1) # check for rows with a nan
Out[624]: array([ True, False, False, False, True])
In [625]: np.where(_)
Out[625]: (array([0, 4]),)
或where
应用于整个数组:
In [626]: np.where(np.isnan(arr))
Out[626]: (array([0, 4]), array([2, 0]))
我可以使用以下内容重现您的错误消息:
In [627]: for i in alist[0]:
...: a = alist[i]
...:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-627-b5ff2521aef0> in <module>()
1 for i in alist[0]:
----> 2 a = alist[i]
3
TypeError: list indices must be integers or slices, not numpy.float64
请注意,这发生在a = alist[i]
行。 你真的应该在你的问题中包含这些信息。
此时的i
是:
In [628]: i
Out[628]: 0.1
alist[0]
的第一个元素。您可能需要查看列表上的迭代如何在Python中工作。 for i in x:
生成x
的元素,而不是索引。通过x[i]
来遵循它是没有意义的。 for i in range(3): x[i]
没问题。 for i,v in enumerate(x): x[i]
也是如此。
答案 1 :(得分:0)
您可以使用np.isnan
以下是检查每一行是否存在NaN
:
boolean_mask = np.empty(sent_vectors.shape)
boolean_mask = np.isnan(sent_vectors)
for idx, row in enumerate(boolean_mask):
if np.any(row):
print("NaN found @ row: ", idx)
print("Row: ", sent_vectors[idx])
else:
continue
答案 2 :(得分:0)
你可以这样做
contains_nan = numpy.isnan(sent_vectors).any()
if contains_nan:
print(sent_vectors)