【问题标题】:How to do numpy logical_and with a margin?如何用边距做 numpy logical_and?
【发布时间】:2019-12-02 09:39:44
【问题描述】:

我有两个 numpy 向量数组,一个包含二进制值,因此为 1 或 0,另一个包含浮点值,因此介于 0 和 1 之间。

我想使用 numpy.logical_and 运算符,如果二进制值在浮点数正负 0.2 的范围内,则让它返回 true。因此,即 0.1 的浮点数将返回真,0.4 假。

我将如何解决这个问题?

【问题讨论】:

  • 您是否打算使用logical_andufunc 功能(即logical_and.accumulate().reduce().at()...)?还是只是基本功能?
  • 我没打算做,有必要吗?
  • 可能不是,但我想确定,因为内置的 numpy 函数 (np.isclose) 不是 ufunc 并且不能做额外的事情 logical_and 可以.

标签: python numpy multidimensional-array vector data-science


【解决方案1】:

我想你想要的是np.isclose。在这种情况下,实现将是:

bin_arr = np.random.randint(2, size = 100)
float_arr = np.random.rand(100)
out = np.isclose(bin_arr.astype(float), float_arr, atol = .2)

请注意,虽然logical_and 是具有扩展功能的ufunc (Universal Function),但np.isclose 不是。

【讨论】:

    【解决方案2】:

    这个问题需要True if (float_arr less than 0.2) AND (bin_arr > 0)。哪个确实需要使用逻辑与。

    True if abs(float_arr - bin_arr) <= 0.2 没有。 @Daniel F 对 isclose() 的使用是一个优雅的答案。

    # Set up some data
    np.random.seed(0)  # Make it repeatable.
    bin_arr = np.random.randint(2, size = 20)
    float_arr = np.random.rand(20) 
    bin_arr, float_arr
    
    # (array([0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1]),
    # array([0.79172504, 0.52889492, 0.56804456, 0.92559664, 0.07103606,
    #        0.0871293 , 0.0202184 , 0.83261985, 0.77815675, 0.87001215,
    #        0.97861834, 0.79915856, 0.46147936, 0.78052918, 0.11827443,
    #        0.63992102, 0.14335329, 0.94466892, 0.52184832, 0.41466194]))
    

    如果 (float_arr 小于 0.2) AND (bin_arr > 0)` 则为真。

    np.logical_and( float_arr<=0.2, bin_arr)
    # array([False, False, False, False,  True,  True,  True, False, False,
    #        False, False, False, False, False, False, False, False, False,
    #        False, False])
    

    如果 abs(float_arr - bin_arr) 则为真

    np.abs(float_arr - bin_arr)<=0.2
    # array([False, False, False, False, False, False, False,  True, False,
    #        True,  True, False, False, False,  True, False,  True, False,
    #        False, False])
    

    【讨论】:

      猜你喜欢
      • 2018-06-01
      • 2019-07-02
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      • 2013-11-12
      相关资源
      最近更新 更多