list indices必须是整数或切片,而不是numpy.float64

时间:2018-06-13 04:00:30

标签: python numpy

我有这样的矩阵:

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

3 个答案:

答案 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

以下是检查每一行是否存在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)