【问题标题】:masking a mxn array using python使用 python 屏蔽 mxn 数组
【发布时间】:2021-10-16 23:00:11
【问题描述】:

嗨,我有一个 mxn 数组数据,我想使用 0 和 1 值对其进行屏蔽。如果存在 0 以外的值,我想将其设为 1,而不是 0,我想保持原样。如果我的值是这样的 0.0000609409412 即小数点后,如果 4 位或更多位为零,那么它应该是零而不是 1

Input:
-2.21520694000000e-15   -1.18292704000000e-15   5.42940708000000e-15      
-2.40108895000000e-15    3.09784301000000e-15  -1.18292704000000e-14
 0                       0                      0
 1.50000000000000        2.100000000000000000   1.40000000000000000

output:
1                       1                   1
1                       1                   1
0                       0                   0
1                       1                   1

【问题讨论】:

  • 您可以使用np.around四舍五入到小数点后4位。然后检查非零值。检查我的答案以获得解决方案。

标签: python-3.x pandas numpy for-loop scipy


【解决方案1】:

编辑:根据您的 cmets 更新了我的答案。

试试这个简单的基于上限和下限的条件,使用 OR | 运算符,然后将类型转换为 int。

lower_limit, upper_limit = -0.00001, 0.00001
masked = ((arr<lower_limit)|(arr>upper_limit)).astype('int')

#Testing it out
[str(j)+'-> masked to -> '+str(masked[i]) for i,j in enumerate(arr)]
['0.0-> masked to -> 0',
 '1.0-> masked to -> 1',
 '0.1-> masked to -> 1',
 '0.01-> masked to -> 1',
 '0.001-> masked to -> 1',
 '0.0001-> masked to -> 1',
 '1e-05-> masked to -> 0',
 '1e-06-> masked to -> 0',
 '1e-07-> masked to -> 0',
 '1e-08-> masked to -> 0']

【讨论】:

  • 它是否适用于这种情况 --- 如果值介于 -0.0001 和 0.0001 之间并且我想将其设为零,那么我应该如何提及阈值
  • 您的意思是附加条件?或者这是你的实际情况?
  • 0.001 会为零吗?还是一个?另外,0会为零吗?因为它介于 -0.0001 和 0.0001 之间
  • 附加条件先生
  • 应该是 1 位先生
【解决方案2】:

试试这个:

array = np.array([
    [-2.21520694000000e-15, -1.18292704000000e-15, 5.42940708000000e-15],
    [-2.40108895000000e-15,   3.09784301000000e-15, -1.18292704000000e-14],
    [0                    ,  0                    , 0],
    [1.50000000000000     ,  2.100000000000000000 , 1.40000000000000000]
])
result = (array != 0).astype('int')

【讨论】:

    【解决方案3】:

    有许多不同的方法可以使用 numpy 来实现这一点,例如类型转换:

    # given arr is <np.ndarray: m, n> 
    new_arr = arr.astype(bool).astype(int)
    

    如果你想过滤掉低于某个阈值的值,你可以这样做:

    threshold = 0.0001
    new_arr = (arr >= threshold).astype(int)
    

    【讨论】:

    • 哦,对不起,我忘了提一个小问题。如果我的值是这样的 0.0000609409412 即小数点后,如果 4 位或更多位为零,那么它应该是零而不是 1
    • 我明白了,我添加了如何将低于阈值的数字过滤为零
    • 如果值介于 -0.0001 和 0.0001 之间并且我想将其设为零,那么我应该如何提及阈值
    • 你可以这样做new_arr = (np.abs(arr) &gt;= 0.0001).astype(int) 假设你希望所有值 x 0.0001 在新数组中显示为 1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    相关资源
    最近更新 更多