TypeError:输入类型不支持ufunc'isfinite',并且不能安全地强制输入

时间:2019-09-23 21:09:32

标签: numpy matrix

您能帮我纠正下面给出的代码吗?

输入:

R:评级矩阵,形状为m x n的浮点数矩阵。如果等级未知,则数字为“无”。

输出:

B:二进制掩码矩阵,形状为m乘n的浮点numpy矩阵。

  • 如果没有缺少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 :(得分:0)

如果R确实是一个浮点数组,则它可以包含nan个元素,而不是None。您不需要循环即可创建numpy数组的掩码:

B = ~np.isnan(R)

答案 1 :(得分:0)

[代码]

def compute_B(R):

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

    return B

答案 2 :(得分:0)

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

或在lambda中包含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]])