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

2024-04-25 08:01:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用np数组中一个元素的列表替换numpy数组中的None值:

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

Tags: numpynone元素列表datanp数组where
3条回答
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,我们应该怎么做。你知道吗

总之,有两个问题

  • 可靠地识别None

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

使用列表理解的替代方法值得考虑。速度将是可压缩的,如果不是更好的话,比数组方法。对象数据类型数组天生就比数字数组慢。你知道吗

你提供的第一行代码没有运行,所以我猜你的意思是

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

根据numpy docs,努比。哪里与所有数组都是1D时的列表理解没有区别

这意味着你可以用

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

下面有一个稍微深奥的技巧:将列表包装成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)

相关问题 更多 >