【问题标题】:How do I accept "divide by zero" as zero? (Python)我如何接受“除以零”为零? (Python)
【发布时间】:2017-03-02 18:41:47
【问题描述】:

所以我有以下代码:

import numpy as np

array1 = np.array([[[[2, 2, 3], [0, 2, 0], [2, 0, 0]],
[[1, 2, 2], [2, 2, 0], [0, 2, 3]],
[[0, 4, 2], [2, 2, 2], [2, 2, 3]]],
[[[2, 3, 0], [3, 2, 0], [2, 0, 3]],
[[0, 2, 2], [2, 2, 0], [2, 2, 3]],
[[1, 0, 2], [2, 2, 2], [2, 2, 0]]],
[[[2, 0, 0], [0, 2, 0], [2, 0, 0]],
[[2, 2, 2], [0, 2, 0], [2, 2, 0]],
[[0, 2, 2], [2, 2, 2], [2, 2, 0]]]])

array2 = np.array([[[[2, 2, 3], [0, 2, 0], [2, 0, 0]],
[[1, 2, 2], [2, 2, 0], [0, 2, 3]],
[[0, 4, 2], [2, 2, 2], [2, 2, 3]]],
[[[2, 3, 0], [3, 2, 0], [2, 0, 3]],
[[0, 2, 2], [2, 10, 0], [2, 2, 3]],
[[1, 0, 2], [2, 2, 2], [2, 2, 0]]],
[[[2, 0, 0], [0, 2, 0], [2, 0, 0]],
[[2, 2, 2], [0, 2, 0], [2, 2, 0]],
[[0, 2, 2], [2, 2, 2], [2, 2, 0]]]])

def calc(x, y):
    result = y/x
    return result

final_result = []
for x, y in zip(array1, array2):
    final_result.append(calc(np.array(x), np.array(y)))

总而言之,我有两个包含一些 3D 数组的列表,然后我定义了一个函数。最后一部分是我在函数中使用每个 3D 数组的地方,我最终得到一个其他 3D 数组的列表 (final_result),其中在 array1array2 的每个条目上都使用了该函数。

但是,如您所见,array1 最终在函数中给出了 x 值,在某些条目中确实有 0 值。是的,从数学上讲,这不好。但在这种情况下,我真的只需要将 x-entry 为零的条目设为零。因此,它不需要在发生这种情况时运行该函数,而只需跳过它,并将该条目保留为零。

这个可以吗?

【问题讨论】:

  • 如何使用:try and except case 以避免此类错误?
  • “我有两个列表,其中包含一些 3D 数组” - 这不是您发布的代码的内容。该代码使用 2 个 4 维数组。数组列表通常是个坏主意。仅当您有非常强烈的特定理由时才应使用它们。
  • 也许我没有使用正确的术语 :) 我实际拥有的(不是这里)是转换为 3D 矩阵的图像。所以你可能看到的 4D 实际上只是图像的切片(CT 扫描)。

标签: python arrays function numpy


【解决方案1】:

这个问题已经回答here。 Numpy 有一种特定的方法来捕获此类错误:

def calc( a, b ):
    """ ignore / 0, div0( [-1, 0, 1], 0 ) -> [0, 0, 0] """
    with np.errstate(divide='ignore', invalid='ignore'):
        c = np.true_divide( a, b )
        c[ ~ np.isfinite( c )] = 0  # -inf inf NaN
    return c

【讨论】:

  • 打败我!我还要指出,你可以全局设置 numpy 如何处理这些错误,这个文档页面很有帮助:docs.scipy.org/doc/numpy/reference/generated/numpy.seterr.html
  • @exp1orer,你能举例说明为什么依赖默认的 numpy 设置是不好的吗?
  • @Marat 我没有对默认设置的好坏做出任何声明,这取决于使用情况。总的来说,我认为 nico 建议使用上下文管理器来明确说明您期望这些错误发生在哪里,这可能是最好的。
  • @exp1orer 谢谢。我认为这条评论为答案增加了一些价值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多