3

我有以下方法:

def get_data(replace_nan=False):
    if replace_nan is not False
        data[numpy.isnan(data)] = replace_nan
        return data
    else:
        return data[~numpy.isnan(data)]

因此,如果replace_nan为 False,我们返回一些数据数组但删除NaNs,如果是其他,我们将NaNs 替换为参数。

问题是,我可能想NaNFalse. 或者别的什么,为了这个。最pythonic的方法是什么?这:

def get_data(**kwargs):
    if "replace_nan" in kwargs:
       ...

有效,但在语义上很难看(因为我们真的只对一个关键字参数感兴趣,replace_nan)有什么建议如何处理这种情况吗?

4

4 回答 4

4

通常人们使用None默认值,然后检查is not None.

如果您也需要允许None,请使用虚拟对象:

__default = object()
def get_data(replace_nan=__default):
    if replace_nan is __default:
        ...
于 2012-05-15T11:01:24.280 回答
2

numpy 将数组内的 False 评估为 0:

    >>>np.array([False,True,2,3])
    array([0, 1, 2, 3])

所以这可能不是你想要发生的。

    def get_data(replace_nan=False):
       if replace_nan:
          return np.where(np.isnan(data),replace_nan,data)
       else:
          return data[~numpy.isnan(data)]

numpy.where 函数使用您的条目为 NaN 的索引构建一个数组。它在那里用replace_nan替换条目,在其他任何地方它都保留条目。

手册页

numpy.where(condition[, x, y])
Return elements, either from x or y, depending on condition.
于 2012-05-15T11:25:30.400 回答
1

我想将此作为评论放在 ThiefMaster 的答案下方,但不允许在评论中格式化,所以...:

如果您担心命名空间混乱,您可以在定义函数后使用一些技巧<code>del 变量。

__default = object()
def get_data(replace_nan=__default, __default=__default):
  if replace_nan is __default:
    ...
del __default

或者:

__default = object()
def get_data(replace_nan=__default):
  if replace_nan is get_data.default_replace_nan:
    ...
get_data.default_replace_nan = __default
del __default
于 2012-05-15T11:48:17.053 回答
1

避免 ThiefMaster 方法混乱的另一种方法是:

def get_data(replace_nan=object()):
  if replace_nan is get_data.func_defaults[0]:
    ...

但是它使用了可能不那么便携的python interna(pypy/stackles/next version/…)。

于 2012-05-15T14:32:48.707 回答