Ошибка типа: ufunc 'isfinite' не поддерживается для типов ввода, и ввод данных не может быть принудительно приведен - PullRequest
0 голосов
/ 24 сентября 2019

Не могли бы вы помочь мне исправить приведенный ниже код?

Ввод:

R: матрица рейтинга, матрица с плавающей запятой формы m на n.Если рейтинг неизвестен, номер None.

Вывод:

B: двоичная маскирующая матрица, матрица с плавающей запятой формы m на n.

  • , если R[i, j] не пропущено,B[i, j] = 1
  • , если R[i, j] отсутствует (нет), B[i, j] = 0

[код]

def compute_B(R):
    for (i, j), value in np.ndenumerate(R):
        if R[i, j] == None:
           R[i, j] = 0
        else:
            R[i, j] = 1

    B = R
    return B

Ответы [ 3 ]

0 голосов
/ 24 сентября 2019

[код]

def compute_B(R):

    B = R != None
    B = B.astype(int)

    return B
0 голосов
/ 24 сентября 2019
In [160]: R = np.array( [ [ 4., 5., 3., None, 1.], [ None, 2., 3., 2., 3.], [ 5.
     ...: , None, 1., 2., None]])                                               
In [161]: R                                                                     
Out[161]: 
array([[4.0, 5.0, 3.0, None, 1.0],
       [None, 2.0, 3.0, 2.0, 3.0],
       [5.0, None, 1.0, 2.0, None]], dtype=object)

Это массив объектов Python, некоторые из которых являются числами, некоторые None.

In [162]: list(np.ndenumerate(R))                                               
Out[162]: 
[((0, 0), 4.0),
 ((0, 1), 5.0),
 ((0, 2), 3.0),
 ((0, 3), None),
 ((0, 4), 1.0),
 ((1, 0), None),
 ((1, 1), 2.0),
 ((1, 2), 3.0),
 ((1, 3), 2.0),
 ...
 ((2, 4), None)]
In [163]: for (i,j),k in np.ndenumerate(R): 
     ...:     if k is None: 
     ...:         R[i,j] = 0 
     ...:     else: 
     ...:         R[i,j] = 1 
     ...:                                                                       
In [164]: R                                                                     
Out[164]: 
array([[1, 1, 1, 0, 1],
       [0, 1, 1, 1, 1],
       [1, 0, 1, 1, 0]], dtype=object)

is None - это правильный тест при ожидании None.

Другой способ сделать тест:

In [167]: np.frompyfunc(lambda k: k is None, 1,1)(R)                            
Out[167]: 
array([[False, False, False, True, False],
       [True, False, False, False, False],
       [False, True, False, False, True]], dtype=object)
In [168]: np.where(np.frompyfunc(lambda k: k is None, 1,1)(R),0,1)              
Out[168]: 
array([[1, 1, 1, 0, 1],
       [0, 1, 1, 1, 1],
       [1, 0, 1, 1, 0]])

Или включая 0/1присвоение в лямбде:

In [169]: np.frompyfunc(lambda k: 0 if k is None else 1, 1,1)(R)                
Out[169]: 
array([[1, 1, 1, 0, 1],
       [0, 1, 1, 1, 1],
       [1, 0, 1, 1, 0]], dtype=object)

Похоже, astype(float) преобразует None в nan:

In [177]: R.astype(float)                                                       
Out[177]: 
array([[ 4.,  5.,  3., nan,  1.],
       [nan,  2.,  3.,  2.,  3.],
       [ 5., nan,  1.,  2., nan]])
In [178]: np.isnan(R.astype(float))                                             
Out[178]: 
array([[False, False, False,  True, False],
       [ True, False, False, False, False],
       [False,  True, False, False,  True]])
In [179]: np.where(np.isnan(R.astype(float)),0,1)                               
Out[179]: 
array([[1, 1, 1, 0, 1],
       [0, 1, 1, 1, 1],
       [1, 0, 1, 1, 0]])
0 голосов
/ 24 сентября 2019

Если R действительно массив с плавающей запятой, он может содержать nan элементов, а не None.Вам не нужен цикл для создания маски массива:

B = ~np.isnan(R)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...