индексы списка должны быть целыми числами или кусочками, а не numpy.float64 - PullRequest
0 голосов
/ 13 июня 2018

У меня есть такая матрица:

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 голосов
/ 13 июня 2018

Вы можете сделать это таким образом

contains_nan = numpy.isnan(sent_vectors).any()
if contains_nan:
    print(sent_vectors)
0 голосов
/ 13 июня 2018

Звучит так, как будто у вас длинный список массивов, некоторые из которых могут содержать 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])

Мы можем перебрать массивы и распечатать те, которыеhave 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]

Если все массивы имеют одинаковую длину, мы можем объединить их в один двумерный массив:

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].

0 голосов
/ 13 июня 2018

Вы можете проверить наличие NaN в массиве / матрице, используя 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...