Python Удалить строки матриц с индексом bool как matlab - PullRequest
0 голосов
/ 25 апреля 2018

У меня следующая проблема.

Учитывая, что у меня есть 9x9 разреженная единичная матрица 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

Я также создаю var1_del в Python, что-то вроде var1(bol(:),) в Matlab

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

это был мойпопробуйте удалить строки.Результат явно неправильный

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

    var1 =
    []

У вас есть идея, как заставить это работать?

1 Ответ

0 голосов
/ 25 апреля 2018

Это очень похоже на то, как будто кто-то переходит из matlab в 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 Advanced Indexing, как, например, чтобы сохранить только те строки, которые нам нужны (~ - это элементный 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...