代码之家  ›  专栏  ›  技术社区  ›  Banana jqurious

为什么Pyinterval算术在numpy中失败。浮动64

  •  2
  • Banana jqurious  · 技术社区  · 7 年前

    我与Pyinterval合作,但由于某些原因,它与 numpy.float64 . 基本上,每当使用 努比。浮动64 而不是通常的 float 在区间算术中,区间被转换为numpy数组。

    以下示例:

    import interval as itv
    import numpy as np
    from math import sqrt
    
    ival = itv.interval([1,2])
    cons = 2
    
    print("interval 1: ",sqrt(cons)*ival)
    print("interval 2: ",np.sqrt(cons)*ival)
    

    打印:

    区间1:区间([1.4142135623730951,2.8284271247461903])

    间隔2:[[1.41421356 2.82842712]]

    相应的类型是。基本上,因为我使用 numpy 很多,我的问题是我是否可以 武力 它要求永远不要使用自己的float64类型,或者如果在每次numpy计算后除了回溯之外还有其他方便的解决方案。

    2 回复  |  直到 4 年前
        1
  •  1
  •   Stephen Rauch Afsar Ali    7 年前

    这可能是由于 numpy 试图将间隔转换为它知道如何乘以的值。这显然是失败的。相反,您可以让间隔库进行转换,这在我的测试中似乎很有效:

    代码:

    ival = itv.interval([1, 2])
    cons = 2
    
    print("interval 1: ", ival * sqrt(cons))
    print("interval 2: ", ival * np.sqrt(cons))
    

    结果:

    ('interval 1: ', interval([1.4142135623730951, 2.8284271247461903]))
    ('interval 2: ', interval([1.4142135623730951, 2.8284271247461903]))
    

    但为什么呢?

    Python实现 * 具有 __mul__ 邓德。调用的dunder是左手操作数的dunder。通过将间隔放在左侧,您将使用其转换,而不是numpy的转换。为什么? 努比 不开心,我目前不知道,但这似乎奏效了。

        2
  •  0
  •   Alex    3 年前

    时间旅行者来了。斯蒂芬的回答很好,但我能回答他最后一个“为什么”的问题。如果python看到两个对象的乘积 A*B 它试图呼叫 A.__mul__(B) 然而,如果方法 __mul__ 对象的 A 无法识别对象的类别 B ,python尝试调用 B.__rmul__(A) . 这是您需要在中实现的方法 interval 为您的第二个案例上课。

    有关更多详细信息,请参见此处 https://docs.python.org/3.8/reference/datamodel.html#emulating-numeric-types