如何使用布尔数组将np.infs清零数组的所有索引?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用布尔数组将np.infs清零数组的所有索引?相关的知识,希望对你有一定的参考价值。

我有一个带有inf值的矩阵和一个布尔数组,用于指示要保留的值。如何使用布尔数组将原始矩阵中的所有值清零,包括infs,但保留所有infs对应于Trues?

X     = [inf, 1, inf]
        [inf, 2,   4]
        [3,   4,   5]

M     = [1,   0,   0]
        [0,   1,   0]
        [0,   1,   0]

(current output)
M * X = [inf, 0, nan]
        [nan, 2,   0]
        [0,   4,   0]

(desired output)
M * X = [inf, 0,   0]
        [0,   2,   0]
        [0,   4,   0]
答案

输入:

In [77]: X    
Out[77]: 
array([[inf,  1., inf],
       [inf,  2.,  4.],
       [ 3.,  4.,  5.]])

In [78]: M 
Out[78]: 
array([[1, 0, 0],
       [0, 1, 0],
       [0, 1, 0]])

途径

首先,我们需要反转掩码M,然后使用numpy.where得到索引;使用这些索引,我们可以将原始数组中的元素设置为零,方法如下:

# inverting the mask
In [59]: M_not = np.logical_not(M)

In [80]: M_not
Out[80]: 
array([[False,  True,  True],
       [ True, False,  True],
       [ True, False,  True]])

# get the indices where `True` exists in array `M_not`
In [81]: indices = np.where(M_not) 

In [82]: indices 
Out[82]: (array([0, 0, 1, 1, 2, 2]), array([1, 2, 0, 2, 0, 2]))

# zero out the elements
In [84]: X[indices] = 0

In [61]: X 
Out[61]: 
array([[inf, 0., 0.],
       [0., 2., 0.],
       [0., 4., 0.]])

附:反转掩模不应被理解为矩阵反转。应该理解为翻转布尔值(True - > False; False - > True

以上是关于如何使用布尔数组将np.infs清零数组的所有索引?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Java中将二维布尔数组转换为一维字节数组?

生成将一个数组索引到另一个数组的布尔掩码

PostgreSQL 多列索引,包括数组

查找值为真的布尔数组的索引

IndexError:布尔索引与索引数组不匹配

将大小为 10000 的数组中的 2 个位置清零,填充从 1 到 10000 的整数。如何找出这些值是啥? [复制]