Numpy 等于不能正常工作

Numpy equal to not working properly

我有一个包含值 new_df.values

的数据框
arr = np.array([[ 0.        ,  0.31652875,  0.05650486,  0.11726623,  0.30987541,
     0.30987541,  0.30987541],
   [ 0.31652875,  0.        ,  0.34982559,  0.33382917,  0.00799828,
     0.00799828,  0.00799828],
   [ 0.05650486,  0.34982559,  0.        ,  0.07718834,  0.34384549,
     0.34384549,  0.34384549],
   [ 0.11726623,  0.33382917,  0.07718834,  0.        ,  0.32917553,
     0.32917553,  0.32917553],
   [ 0.30987541,  0.00799828,  0.34384549,  0.32917553,  0.        ,
     0.        ,  0.        ],
   [ 0.30987541,  0.00799828,  0.34384549,  0.32917553,  0.        ,
     0.        ,  0.        ],
   [ 0.30987541,  0.00799828,  0.34384549,  0.32917553,  0.        ,
     0.        ,  0.        ]])

而且我找到了除零以外的最小值,例如

# new_df[new_df != 0].min().values this is want was used to get this

min_arr = np.array([ 0.05650486,  0.00799828,  0.05650486,  0.07718834,  0.00799828,
    0.00799828,  0.00799828])

当我执行 arr == min_arrnp.isclose(arr,min_arr) 时,我得到:

array([[False, False,  True, False, False, False, False],
       [False, False, False, False,  True,  True,  True],
       [ True, False, False,  True, False, False, False],
       [False, False, False, False, False, False, False],
       [False,  True, False, False, False, False, False],
       [False,  True, False, False, False, False, False],
       [False,  True, False, False, False, False, False]], dtype=bool)

一切正常,但第四行不行。我可以知道为什么吗?有什么解决方法吗?

看来您需要在 np.isclose 内扩大广播的最小值形状。如果没有 [:, None],我会在第 4 行遇到同样的问题。

arr[arr == 0] = np.nan
mins = np.nanmin(arr, axis=1)
print(np.isclose(arr, mins[:, None]))  # need to expand dim/newaxis

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

错误原因:当您仅使用 1d mins 时,您是在 沿行 逐元素进行比较。令人困惑的部分是,该比较实际上看起来很像您预期的解决方案,除了一个单元格。

例如,在不扩展到新轴的情况下,第一行的比较如下所示:

arr[0] == mins

这似乎不是你想要的。