Как удалить подмассивы из многомерных массивов numpy с помощью условия?

Я пытаюсь удалить подмассивы из многомерного массива numpy, используя условие. В этом примере я хочу удалить все подмассивы, содержащие значение 999. Вот одна из моих неудачных попыток:

a = np.array([[[1,2,3], [1,2,3]],
              [[999,5,6], [4,5,6]],
              [[999,8,9], [7,999,9]]
              ])

for i in range(0,len(a)):
    if 999 in a[i]:
        np.delete(a, i, 0)

Результат, который я хочу:

array([[1,2,3], [1,2,3]])

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

# win_list_hyper.shape -> (1449168, 233)
# win_list_multi.shape -> (1449168, 12, 5, 5)

win_list_hyper = np.where(win_list_hyper <= 0, -3.40282e+38, win_list_hyper)
win_list_multi = np.where(win_list_multi <= 0, -3.40282e+38, win_list_multi)


# fail!:
for i in range(0,len(win_list_multi)):
    
    if -3.40282e+38 in win_list_multi[i] or -3.40282e+38 in win_list_hyper[i]:
        
        np.delete(win_list_multi, i, 0)
        np.delete(win_list_hyper, i, 0)

(кстати, если вы знаете, как сделать это более эффективным, пожалуйста, дайте мне знать!)

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
466
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ваша первая попытка не удалась, так как np.delete не работает на месте (т. е. не изменяет массив, а возвращает новый). Кроме того, удаление элементов из массива во время его повторения обычно не является хорошей идеей (если вы не знаете, что делаете).

Вы можете просто использовать np.where следующим образом:

inds = np.where(a == 999)  # get indices where value equals 999
np.delete(a, inds[0], axis=0)   # delete along first dimension

Результат:

array([[[1, 2, 3],
        [1, 2, 3]]])

Спасибо за помощь. Я должен был понять, что мой пример не был хорошим. Я не мог так легко перевести ваше решение на мои данные. Тем не менее, вы мне очень помогли. Ваше решение дало мне идею замаскировать мои массивы. Я надеюсь, что мое решение не испортит мои данные (например, перетасует их).

Rebecca 15.12.2020 23:17

Решение Jussi Nurminen отлично работает для моего примера, но я должен был понять, что мой пример не очень хорош. Я не мог так легко перевести данное решение на свои данные. Тем не менее, решение Jussi Nurminen мне очень помогло, потому что оно дало мне Идею замаскировать мои массивы. Я надеюсь, что мое решение не испортит мои данные (например, перетасует их). Для тех, кому интересно...

... Это мое решение для моего (плохого) примера:

a = np.array([[[1,2,3], [1,2,3]],[[999,5,6], [4,5,6]],[[999,8,9], [7,999,9]]])

a_mask = []

for i in range(0,len(a)):
    if 999 in a[i]:
        x = 0
    else: x = 1
    
    a_mask.append(x)
 
a_mask = np.asarray(a_mask)
    
inds = np.where(a_mask == 0)
        
b = np.delete(a, inds, axis=0) 

... А вот как это выглядит в переводе на мои данные:


# win_list_multi.shape -> (1449168, 12, 5, 5)
# win_list_hyper.shape -> (1449168, 233


win_list_multi = np.where(win_list_multi <= 0, -1, win_list_multi)

win_list_hyper = np.where(win_list_hyper <= 0, -1, win_list_hyper)


win_list_multi_mask = []

for i in range(0,len(win_list_multi)):
    if -1 in win_list_multi[i]:
        x = 0
    else: x = 1
    
    win_list_multi_mask.append(x)

win_list_multi_mask = np.asarray(win_list_multi_mask)



win_list_hyper_mask = []

for i in range(0,len(win_list_hyper)):
    if -1 in win_list_hyper[i]:
        x = 0
    else: x = 1
    
    win_list_hyper_mask.append(x)

win_list_hyper_mask = np.asarray(win_list_hyper_mask)



inds = np.where((win_list_multi_mask == 0) | (win_list_hyper_mask == 0))


win_list_multi_nd = np.delete(win_list_multi, inds, axis=0) 
win_list_hyper_nd = np.delete(win_list_hyper, inds, axis=0) 

# win_list_multi_nd.shape -> (9679, 12, 5, 5)
# win_list_hyper_nd.shape -> (9679, 233)

Другие вопросы по теме