用np数组中的列表替换None值

时间:2019-11-03 21:33:18

标签: python numpy

我正在尝试将numpy数组中的None值替换为np数组中一个元素的列表:

data_inputs = np.array([[1], [2], [3], [None], None])
data_inputs = np.where(array == None, [5], data_inputs)

我得到以下结果:

   np.array([[1], [2], [3], [5], 5])

我要跟踪结果:

   np.array([[1], [2], [3], [5], [5]])

3 个答案:

答案 0 :(得分:1)

In [132]: x = np.array([[1], [2], [3], None])                                   

用简单的索引替换元素:

In [133]: x[3]=[5]                                                              
In [134]: x                                                                     
Out[134]: array([list([1]), list([2]), list([3]), list([5])], dtype=object)

找到None元素:

In [135]: x = np.array([[1], [2], [3], None])                                   
In [136]: x==None                                                               
Out[136]: array([False, False, False,  True])

通常我们说用is None代替,但这不适用于数组。在这里,我怀疑对象数组测试可能正在执行id匹配。所以这个测试是暂时的。

我们可以使用布尔掩码找到x

In [137]: x[x==None]                                                            
Out[137]: array([None], dtype=object)
In [138]: x[x==None]=[5]                                                        
In [139]: x                                                                     
Out[139]: array([list([1]), list([2]), list([3]), 5], dtype=object)

但是,这个数字不是列表。我怀疑这是因为Out[137]返回一个1d数组。

您的where可能与np.nonzero(别名np.where)的使用接近:

In [142]: x = np.array([[1], [2], [3], None])                                   
In [143]: idx = np.nonzero(x==None)                                             
In [144]: idx                                                                   
Out[144]: (array([3]),)
In [145]: x[idx]                                                                
Out[145]: array([None], dtype=object)

如果我们从idx中提取标量索引,它将起作用:

In [146]: x[idx[0][0]]                                                          
In [147]: x[idx[0][0]] = [5]                                                    
In [148]: x                                                                     
Out[148]: array([list([1]), list([2]), list([3]), list([5])], dtype=object)

因此,只要我使用标量索引而不是列表,布尔值或数组索引,就可以用列表替换对象数组的单个元素。我不确定如果示例中有多个None,该怎么办。

总的来说,有2个问题

  • 可靠地标识None

  • 用列表替换对象数组的元素。

使用列表理解的替代方法值得考虑。如果不是更好,速度将比数组方法可比。对象dtype数组本质上比数字数组慢。

答案 1 :(得分:0)

您提供的第一行代码未运行,因此我假设您的意思是

data_inputs = np.array([[1], [2], [3], None])

根据numpy docs,当所有数组均为一维时,numpy.where与列表推导没有区别。

这意味着您可以通过以下方式解决此问题

np.array([ [5] if d is None else d for d in data_inputs ])

答案 2 :(得分:0)

以下是一些深奥的技巧:将列表包装在0D数组中。

data_inputs = np.array([[1], [2], [3], None])
# create 0D object array
# can't do np.array([5],object) for obvious reasons, instead
aux = np.array(None)
aux[()] = [5]

# and now
np.where(data_inputs == None, aux, data_inputs)
# array([list([1]), list([2]), list([3]), list([5])], dtype=object)