【问题标题】:Unable to understand working of np.isclose()无法理解 np.isclose() 的工作
【发布时间】:2022-06-12 21:08:54
【问题描述】:

对于以下输入:

import numpy as np

a= np.array([[0.0, 0.0, 0.0],
            [1.0, 1.0, -2.234],
            [0.0, 0.0, 0.0]])

b= np.array([1.0, 1.0, -2.234])
print(np.isclose(np.transpose(a), b))

输出:

$ python temp.py 
--> [[False  True False]
    [False  True False]
    [False False False]]

对于以下输入:

print(np.isclose(a, b))

输出:

$ python temp.py 
--> [[False False False]
    [ True  True  True]
    [False False False]]

我无法理解为什么np.isclose() 无法按元素匹配列,但能够正确匹配行。我觉得我的理解有问题。

我的目的是找到匹配列的索引。为了实现这一点,我将进一步使用.all(axis=)np.where()。但在此之前我想了解np.isclose()的行为。

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    这里发生的是numpy自动"broadcasts"低维数组以匹配高维数组的形状。

    在这个具体实例中,b 数组被广播到一个矩阵中,其中每一行都是原始数组b 的副本。您可以通过调用np.broadcast_to(b, a.shape) 提前检查它被广播到的形状。

    a= np.array([[0.0, 0.0, 0.0],
                [1.0, 1.0, -2.234],
                [0.0, 0.0, 0.0]])
    
    b= np.array([1.0, 1.0, -2.234])
    print(np.isclose(np.transpose(a), b))
    

    np.isclose(np.transpose(a), b) 解析为

    np.isclose([[0.0, 1.0, 0.0],
                [0.0, 1.0, 0.0],
                [0.0, -2.234, 0.0]],
    
               [[1.0, 1.0, -2.234],
                [1.0, 1.0, -2.234],
                [1.0, 1.0, -2.234]])
    
    --> [[False  True False]
         [False  True False]
         [False False False]]
    

    np.isclose(a, b) 解析为

    np.isclose([[0.0, 0.0, 0.0],
                [1.0, 1.0, -2.234],
                [0.0, 0.0, 0.0]],
    
               [[1.0, 1.0, -2.234],
                [1.0, 1.0, -2.234],
                [1.0, 1.0, -2.234]])
    
    --> [[False False False]
         [ True  True  True]
         [False False False]]
    

    【讨论】:

      【解决方案2】:

      考虑您的转置数组ab

      [[ 0.     1.     0.   ]
       [ 0.     1.     0.   ]
       [ 0.    -2.234  0.   ]]
      
      [ 1.     1.    -2.234]
      

      np.isclose 所做的实际上是根据广播比较(在给定的容差范围内)a 的每一行中的每个元素与 b 中的每个元素,从而产生输出:

      [[False  True False]
       [False  True False]
       [False False False]]
      

      如果您想“按列”比较数组,您应该显式地向b 添加一个额外的维度。数组 ab 将如下所示:

      [[ 0.     1.     0.   ]
       [ 0.     1.     0.   ]
       [ 0.    -2.234  0.   ]]
      
      [[ 1.   ]
       [ 1.   ]
       [-2.234]]
      

      然后你可以看看它们是否相等:

      import numpy as np
      
      a= np.array([[0.0, 0.0, 0.0],
                  [1.0, 1.0, -2.234],
                  [0.0, 0.0, 0.0]])
      
      b = np.array([1.0, 1.0, -2.234])
      a = np.transpose(a)
      b = np.expand_dims(b , axis=-1)
      print(np.isclose(a, b))
      
      [[False  True False]
       [False  True False]
       [False  True False]]
      

      【讨论】:

        【解决方案3】:

        np.isclose 只是检查这些值是否足够接近,您可以认为它们与给定阈值相等

        通过做:

        np.isclose(np.transpose(a), b)
        

        您将 a.T 的每一列与 b 的每一列进行比较。 第一列[0,0,0] 不接近(即几乎等于)1。对于第二列[1,1,-2.234],前两个值等于1。对于最后一列 [0,0,0],没有任何内容与 -2.234 匹配。

        [[False  True False]
         [False  True False]
         [False False False]]
        

        【讨论】:

          猜你喜欢
          • 2014-04-08
          • 2012-01-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-03
          • 1970-01-01
          相关资源
          最近更新 更多