我正在尝试将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]])
答案 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)