2017-05-31 70 views
1
x = np.empty([2], dtype=object) 
> array([None, None], dtype=object) 

x[0] = 'a' 
> array(['a', None], dtype=object) 

我想从这个对象中获取布尔数组[False, True]的ndarray类型ndarray在对象类型为None的elementwise比较无与对象D型

不起作用的东西:x is None,x.isfinite(),x == None,np.isnan(x)。该数组可能在n维度中,使循环迭代看起来不愉快。

+1

另外,你应该尽力避免w用'dtype = object'数组进行操作。他们基本上是发育不良的Python列表。也许你可以尝试一个大小的字符串dtype? –

+0

NumPy的也有[MaskedArrays(https://docs.scipy.org/doc/numpy/reference/maskedarray.generic.html),他们可能不完全容易初步掌握。但特别是如果你有一些“无效”条目,这些比对象数组快得多。 – MSeifert

回答

6

在NumPy的1.12和更早的版本,你需要显式调用numpy.equal获得广播相等比较。发表评论,所以未来的读者理解为什么你这样做:

# Comparisons to None with == don't broadcast (yet, as of NumPy 1.12). 
# We need to use numpy.equal explicitly. 
numpy.equal(x, None) 

在NumPy的1.13后来,x == None will give you a broadcasted equality comparison,但你仍然可以使用numpy.equal(x, None),如果你想与早期版本的向后兼容性。

1

一些可能的方式来做到这一点是 -

x < 0 
x!='a' 

阵列([真,假],D型细胞=布尔)

+0

x <0是一个惊喜,整洁的捷径。 x!='a'当然只适用于'a',但如果这就是目标,那就是好点。谢谢! –

+3

'<0'方法只适用于python-2.x。在Python 3中它会抛出异常。此外,返回似乎是错误的 - 我得到'array'([False,True],dtype = bool)''x!='a''比较。 – MSeifert

2

可以在一个listarray包裹None到力元素比较:

>>> x == [None] 
array([False, True], dtype=bool) 

>>> x == np.array([None]) 
array([False, True], dtype=bool)