Python删除像bolab一样的bool索引的矩阵行

时间:2018-04-25 11:08:42

标签: python matlab numpy

我有以下问题。

考虑到我有9 x 9稀疏单位矩阵var和3x3布尔矩阵bol,其中位置(2,2)的值为False。

在matlab中我可以删除这样的行

    var1 = speye(9);
    bol=false(3,3);
    bol(3:3,1:3)=1;
    bol(1:3,1:1)=1;
    bol(1:1,1:3)=1;
    bol(1:3,3:3)=1;

    var1(bol(:),:)=[];

我得到了结果

    var1 =
    (1,5)    1

如何在Python中轻松完成这项工作?

在Python中,我创建了这样的变量:

    import numpy as np
    from scipy import sparse

    var1 = sparse.eye(9).tocsc()
    bol = np.zeros((3,3),dtype='bool')
    bol[2:3,0:3]=1
    bol[0:3,0:1]=1
    bol[0:1,1:3]=1
    bol[0:3,-1]=1

我还在Python中创建var1_del,类似于matlab中的var1(bol(:),)

    va1_del = var1[bol.reshape(9)[:],:]

这是我尝试删除行。结果显然是错误的

    var1 = [x for x in var1 if not x in var_del]

    var1 =
    []

你知道如何让它发挥作用吗?

1 个答案:

答案 0 :(得分:1)

这看起来很像从matlab到python的人。有一些方法可以进行python化。

import numpy as np
from scipy import sparse

var1 = sparse.eye(9).tocsc()

# we can make our truth matrix much faster
bol = np.ones((3, 3), dtype='bool')
bol[1, 1] = False

在matlab中删除一行,将其设置为[]。在python中,我们可以像这样使用numpy高级索引来保留我们想要的行(~是明智的not运算符):

# ~bol.flatten(): array([False, False, False, False,  True, False, False, False, False])
var1 = var1[~bol.flatten()]

var1现在是:

repr: <1x9 sparse matrix of type '<class 'numpy.float64'>'
           with 1 stored elements in Compressed Sparse Column format>
str:  (0, 4)        1.0

因为我们在python中每个索引都少1,所以这与你的matlab结果相同。