Вернуть пустую матрицу без определенной строки - PullRequest
0 голосов
/ 20 марта 2019

У меня есть матрица [n x 3]. Я хочу указать строку:
test_row = np.array([a, b, c])
и удалите его из моей матрицы.

Есть ли лучший способ, чем использовать for и np.array_equal для всей матрицы?

Ответы [ 2 ]

0 голосов
/ 20 марта 2019
In [318]: arr = np.arange(24).reshape(8,3)                                                
In [319]: test = np.array([6,7,8])                                                        

Сравнение всего массива между 2:

In [322]: np.isin(arr,test)                                                               
Out[322]: 
array([[False, False, False],
       [False, False, False],
       [ True,  True,  True],
       [False, False, False],
       [False, False, False],
       [False, False, False],
       [False, False, False],
       [False, False, False]])

Найдите строку, в которой совпадают все термины:

In [323]: np.isin(arr,test).all(axis=1)                                                   
Out[323]: array([False, False,  True, False, False, False, False, False])

Используйте ее инверсию в качестве маски для выборастроки хранителя:

In [324]: arr[~_]                                                                         
Out[324]: 
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 9, 10, 11],
       [12, 13, 14],
       [15, 16, 17],
       [18, 19, 20],
       [21, 22, 23]])

isin на самом деле in1d плюс изменение формы:

In [327]: np.in1d(arr,test)                                                               
Out[327]: 
array([False, False, False, False, False, False,  True,  True,  True,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False])
In [328]: np.in1d(arr,test).reshape(arr.shape)                                            
Out[328]: 
array([[False, False, False],
       [False, False, False],
       [ True,  True,  True],
       [False, False, False],
       [False, False, False],
       [False, False, False],
       [False, False, False],
       [False, False, False]])

Это транслируемое сравнение также работает:

(arr[:,None,:]==test[None,:,None]).any(axis=1).all(axis=1)
0 голосов
/ 20 марта 2019

Альтернативой удалению нужных строк является то, что если вы знаете, какой индекс строки вы хотите удалить , вы можете просто нарезать оставшиеся строки и объединить их в матрицу, как впример ниже:

In [8]: arr = np.arange(5*3).reshape(5, 3)

In [9]: arr
Out[9]: 
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11],
       [12, 13, 14]])

In [10]: remove_row_idx = 2

In [11]: np.vstack((arr[:remove_row_idx, :], arr[remove_row_idx+1:,]))
Out[11]: 
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 9, 10, 11],
       [12, 13, 14]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...