【问题标题】:TypeError: ufunc 'isfinite' not supported for the input types, and the inputs could not be safely coercedTypeError:输入类型不支持 ufunc 'isfinite',并且输入无法安全强制
【发布时间】:2019-09-23 21:09:32
【问题描述】:

你能帮我更正下面给出的代码吗?

输入:

R:评分矩阵,一个形状为 m x n 的浮点 numpy 矩阵。如果评级未知,则数字为无。

输出:

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

【问题讨论】:

  • 缺少的数字是 None 还是 NaN?
  • numpy 数组中的一些元素是'None'
  • @VishawV。这意味着您没有浮动数组。请发布一个可重现的示例。
  • @MadPhysicist。兄弟,R = np.array( [ [ 4., 5., 3., None, 1.], [ None, 2., 3., 2., 3.], [ 5., None, 1. , 2., 无]])
  • 嗨,我解决了这个问题。感谢您的帮助。

标签: numpy matrix


【解决方案1】:

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

B = ~np.isnan(R)

【讨论】:

  • 您好,现在显示 ufunc: 'isnan' not supported for the input types。 R 的测试用例是一个 numpy 数组,其中某些地方的元素为“None”,其他地方的元素为数字。
  • @VishawV。 dtype 是什么?
【解决方案2】:

[代码]

def compute_B(R):

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

    return B

【讨论】:

  • 以下是How do I write a good answer? 的一些指南。提供的这个答案可能是正确的,但它可以从解释中受益。仅代码答案不被视为“好”答案。来自review
【解决方案3】:
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]])

【讨论】:

  • @hapulj,是的,这完全有道理,而且效果很好。谢谢。
猜你喜欢
  • 2019-12-04
  • 2020-09-29
  • 2019-03-10
  • 2020-02-16
  • 2019-11-04
  • 1970-01-01
  • 2020-07-28
  • 2018-01-08
  • 2022-12-17
相关资源
最近更新 更多