python的max函数如何处理np.nan?



最近我发现了一个非常不直观的行为:

import numpy as np
max([0, np.nan])  # 0 
max([np.nan, 0.0])  # np.nan

我假设max函数将两个条目都视为最大值,并根据文档返回第一个条目。我必须承认,我不知道Python函数max一般是如何处理numpy类型的。当然是np。Max返回预期结果(np.nan)。我正在使用Python 3。有人知道这是怎么回事吗?

因为您在numpy NaN值上使用本机python max()函数,所以行为不明显。我找到了这个问题和相应的答案:

原因是max的工作原理是将第一个值作为"到目前为止看到的最大值",然后检查其他值是否大于到目前为止看到的最大值。但是nan的定义使得与它的比较总是返回False——即nan>1是假的,但1>Nan也是假的

如果你以nan作为数组的第一个值,每随后的比较将检查some_other_value>南。这将始终为false,因此nan将保留其位置为"max到目前为止。另一方面,如果nan不是第一个值,则当达到该值时,比较值为>Max_so_far将再次为假的。但在这种情况下,这意味着目前为止看到的最大值。(它不是nan)仍然是目前为止看到的最大值,所以nan会总是被丢弃。