Удаление нескольких элементов одновременно из массива 2d - PullRequest
0 голосов
/ 29 сентября 2019

Есть ли способ удалить из массива 2d, когда у меня есть индексы?Например:

a = np.random.random((4,5))
idxs = [(0,1), (1,3), (2, 1), (3,4)]

Я хочу удалить указанные выше индексы.Я попытался:

np.delete(a, idxs)

, но он просто удаляет верхний ряд.

Чтобы привести пример для следующего ввода:

    [
        [0.15393912, 0.08129568, 0.34958515, 0.21266128, 0.92372852],
        [0.42450441, 0.1027468 , 0.13050591, 0.60279229, 0.41168151],
        [0.06330729, 0.60704682, 0.5340644 , 0.47580567, 0.42528617],
        [0.27122323, 0.42713967, 0.94541073, 0.21462462, 0.07293321]
    ]

и с указанными выше индексами, я хочу, чтобы результат был:

    [
        [0.15393912, 0.34958515, 0.21266128, 0.92372852],
        [0.42450441, 0.1027468 , 0.13050591, 0.41168151],
        [0.06330729, 0.5340644 , 0.47580567, 0.42528617],
        [0.27122323, 0.42713967, 0.94541073, 0.21462462]
    ]

Ответы [ 4 ]

2 голосов
/ 29 сентября 2019

ваш индекс должен быть для плоского массива, иначе он работает только для удаления строки или столбца.

Вот как вы можете конвертировать индекс и использовать его

arr = np.array([
    [0.15393912, 0.08129568, 0.34958515, 0.21266128, 0.92372852],
    [0.42450441, 0.1027468 , 0.13050591, 0.60279229, 0.41168151],
    [0.06330729, 0.60704682, 0.5340644 , 0.47580567, 0.42528617],
    [0.27122323, 0.42713967, 0.94541073, 0.21462462, 0.07293321]
])

idxs = [(0,1), (1,3), (2, 1), (3,4)]

idxs = [i*arr.shape[1]+j for i, j in idxs]

np.delete(arr, idxs).reshape(4,4)

для изменения формы вы должныудалить элементы так, чтобы после удаления было одинаковое количество элементов, а также строк и столбцов

0 голосов
/ 29 сентября 2019

Вот метод, использующий np.where

import numpy as np
import operator as op

a = np.arange(20.0).reshape(4,5)
idxs = [(0,1), (1,3), (2, 1), (3,4)]

m,n = a.shape

# extract column indices
# there are simpler ways but this is fast
columns = np.fromiter(map(op.itemgetter(1),idxs),int,m)

# build decimated array
result = np.where(columns[...,None]>np.arange(n-1),a[...,:-1],a[...,1:])

result
# array([[ 0.,  2.,  3.,  4.],
#        [ 5.,  6.,  7.,  9.],
#        [10., 12., 13., 14.],
#        [15., 16., 17., 18.]])
0 голосов
/ 29 сентября 2019

Numpy не знает, что вы удаляете ровно один элемент в строке, когда вы даете ему произвольные индексы, подобные этому.Поскольку вы это знаете, я бы предложил использовать маску для сокращения массива.Маскировка имеет ту же проблему: она не принимает ничего о форме результата (потому что она не может вообще) и возвращает разбитый массив.Вы можете восстановить желаемую форму довольно легко, хотя.На самом деле, я бы предложил полностью удалить первый элемент каждого индекса, поскольку у вас есть один элемент в строке:

 def remove_indices(a, idx):
     if len(idx) != len(idx): raise ValueError('Wrong number of indices')
     mask = np.ones(a.size, dtype=np.bool_)
     mask[np.arange(len(idx)), idx] = False
     return a[mask].reshape(a.shape[0], a.shape[1] - 1)
0 голосов
/ 29 сентября 2019

Как сказано в документации

Возвращает новый массив с удаленными подмассивами вдоль оси.

np.delete удаляет строку или столбец на основезначение параметра оси.

Во-вторых, np.delete ожидает int или массив int как параметр, а не список кортежей.

вам необходимо указать, что это за требование.

Как @divakar предложил посмотреть другие ответы на Stackoverflow, касающиеся удаления отдельных элементов в массиве numpy.

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