从矩阵中删除某些值

时间:2018-08-06 15:19:51

标签: python

我想从矩阵中删除所有零,因此将删除包含零的每一行或每一列。 像这样: 输入是这个矩阵:

Paul Tiger;071150885524;0151-19630027

三个零应导致删除行1和3(从零开始的索引)以及列1和2。输出矩阵应为:

np.array([
     [1, 2, 3, 4, 5],
     [6, 0, 8 ,9,10],
    [11,12,13,14,15],
    [16, 0, 0,19,20]])

到目前为止,我已经尝试过:

np.array([
    [ 1, 4, 5],
    [11,14,15]])

2 个答案:

答案 0 :(得分:3)

您可以使用np.ix_来处理索引魔术:

In [26]: arr = np.array([[1,2,3,4,5],[6,0,8,9,10],[11,12,13,14,15],[16,0,0,19,20]])

In [27]: mask = arr != 0

In [28]: arr[np.ix_(mask.all(1), mask.all(0))]
Out[28]: 
array([[ 1,  4,  5],
       [11, 14, 15]])

有问题的索引魔术是np.ix_将布尔数组变成每个轴的正确索引:

In [29]: mask.all(1)
Out[29]: array([ True, False,  True, False])

In [30]: mask.all(0)
Out[30]: array([ True, False, False,  True,  True])

In [31]: np.ix_(mask.all(1), mask.all(0))
Out[31]: 
(array([[0],
        [2]]), array([[0, 3, 4]]))

这根本不是那么神奇,它确实有效

In [34]: np.arange(len(mask.all(1)))[mask.all(1)]
Out[34]: array([0, 2])

在幕后。

答案 1 :(得分:1)

您的初始方法的问题是,第一个循环会删除所有带有零的行。当您进入第二个循环时,将没有零,也没有关于它们在哪里的线索,因此您无法删除任何列。

在第一个循环中,而不是删除行,而是将所有非零条目设置为NaN或其他一些“标记”值。然后删除零的每一列。最后,返回并使用NaN删除行。

相关问题