我有一个由一堆值组成的数组,其中一些是Nan,其他的是None。我想数一数他们每个人。我可以用一个简单的for循环来实现,如图所示,
xx = np.array([2,3,4,None,np.nan,None])
count_None = 0
count_nan = 0
for i in xx:
if i is None:
count_None =+ 1
if i is np.nan:
count_nan =+ 1
我想看看我是否可以在一行中实现相同的结果,也许使用lambda函数。我试着这样写。当然,语法是不正确的。有什么想法吗?
lambda xx: count_None =+1 if xx is None
5条答案
按热度按时间pod7payv1#
实现它作为一个班轮的一种方法是:
也可以使用
numpy.count_nonzero
:使用lambda函数,你可以创建一个类似
list.count()
的函数:omqzjyyz2#
这不是一个lambda,但它创建了一个新的列表,只有None值,并计算该列表的长度。
如果你不需要它在numpy中,你可以使用列表计数方法
vohkndzv3#
lambda
只是一种用于创建函数的受限格式。它是“一行”并返回一个值。它不应该用于副作用。你使用counter += 1
是一个副作用,所以不能在lambda
中使用。lambda
标识None
值,可与map
一起使用:map
返回一个iterable,它必须用list
或sum
扩展:但正如其他人所示,列表
count
方法更简单。包含
None
的数组将是对象dtype
。在这样的数组上迭代比在列表上迭代慢:数组没有
count
方法。测试np.nan
也比较棘手。有一个
np.isnan
函数,但它只适用于float
dtype数组。68bkxrlz4#
第三种方法:
我倾向于使用两行代码(每个计算一行),但这样也行。它的工作原理是为每个True值添加1,为每个False值添加0。
如果你真的想使用lambda,另一种方法是使用
functools.reduce
,它将迭代地执行求和。在这里,我们从值0开始,并为每个评估为true的元素添加1:wmvff8tz5#
l= len(list(filter(lambda x:x is None,xx)))
它将返回NaN值的数量。但是过滤器函数只对列表起作用。如果你想使用lambda,你可以使用这种方法。我更喜欢使用numpy函数(np.count_nonzero)