【问题标题】:numpy.where : how to delay evaluating parameters?numpy.where :如何延迟评估参数?
【发布时间】:2016-07-08 23:40:16
【问题描述】:

我正在使用numpy.where,我想知道是否有一种简单的方法可以避免调用未使用的参数。示例:

import numpy as np
z = np.array([-2, -1, 0, 1, -2])
np.where(z!=0, 1/z, 1)

返回:

array([-0.5, -1. ,  1. ,  1. , -0.5])

但我得到一个除以零的警告,因为当 z 为 0 时,代码仍会评估 1/z,即使它不使用它。

【问题讨论】:

  • 你为什么不使用 z = z[np.nonzero(z)] 然后除以 z,但这只是返回 1 所以我想我不知道为什么
  • 1/z 由解释器执行,作为调用where 的一部分。这不受where 的控制。但是你可以做out[ind]=1/z[ind] 其中ind 是ok 值的掩码。还有其他处理除以零的方法。
  • 搜索 [numpy] 和 [除零] 标签

标签: python numpy divide-by-zero


【解决方案1】:

您也可以关闭警告并在完成后重新打开 使用上下文管理器errstate

with np.errstate(divide='ignore'):
    np.where(z!=0, 1/z, 1)

【讨论】:

    【解决方案2】:

    您可以使用遮罩:

    out = numpy.ones_like(z)
    mask = z != 0
    out[mask] = 1/z[mask]
    

    【讨论】:

      【解决方案3】:

      scipy 有一个小工具就是为了这个目的: https://github.com/scipy/scipy/blob/master/scipy/_lib/_util.py#L26

      这基本上是分配输出数组并使用np.place(或putmask)来准确填充您需要的内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-26
        • 1970-01-01
        • 2021-05-17
        • 1970-01-01
        • 2022-01-07
        • 1970-01-01
        • 2011-03-03
        • 1970-01-01
        相关资源
        最近更新 更多