Python фильтрация двумерного массива

Как отфильтровать массив NumPy (4 примера)

Вы можете использовать следующие методы для фильтрации значений в массиве NumPy:

Метод 1: фильтрация значений на основе одного условия

#filter for values less than 5 my_array[my_array < 5 ] 

Метод 2: фильтрация значений с использованием условия «ИЛИ»

#filter for values less than 5 *or* greater than 9 my_array[(my_array < 5 ) | (my_array >9 )] 

Способ 3: фильтрация значений с использованием условия «И»

#filter for values greater than 5 *and* less than 9 my_array[(my_array > 5 ) & (my_array < 9 )] 

Способ 4: фильтрация значений, содержащихся в списке

#filter for values that are equal to 2, 3, 5, or 12 my_array[np.in1d (my_array, [2, 3, 5, 12])] 

В этом руководстве объясняется, как использовать каждый метод на практике со следующим массивом NumPy:

import numpy as np #create NumPy array my_array = np.array([1, 2, 2, 3, 5, 6, 7, 10, 12, 14]) #view NumPy array my_array array([ 1, 2, 2, 3, 5, 6, 7, 10, 12, 14]) 

Пример 1. Фильтрация значений по одному условию

В следующем коде показано, как фильтровать значения в массиве NumPy на основе всего одного условия:

#filter for values less than 5 my_array[(my_array < 5 )] array([1, 2, 2, 3]) #filter for values greater than 5 my_array[(my_array >5 )] array([ 6, 7, 10, 12, 14]) #filter for values equal to 5 my_array[(my_array == 5 )] array([5]) 

Пример 2. Фильтрация значений с использованием условия «ИЛИ»

В следующем коде показано, как фильтровать значения в массиве NumPy с помощью условия «ИЛИ»:

#filter for values less than 5 *or* greater than 9 my_array[(my_array < 5 ) | (my_array >9 )] array([ 1, 2, 2, 3, 10, 12, 14]) 

Этот фильтр возвращает значения в массиве NumPy, которые меньше 5 или больше 9.

Пример 3. Фильтрация значений с использованием условия «И»

В следующем коде показано, как фильтровать значения в массиве NumPy с помощью условия «И»:

#filter for values greater than 5 *and* less than 9 my_array[(my_array > 5 ) & (my_array < 9 )] array([6, 7]) 

Этот фильтр возвращает значения в массиве NumPy, которые больше 5 и меньше 9.

Читайте также:  Php if file ends with

Пример 4: значения фильтра, содержащиеся в списке

В следующем коде показано, как фильтровать значения в массиве NumPy, содержащиеся в списке:

#filter for values that are equal to 2, 3, 5, or 12 my_array[np.in1d (my_array, [2, 3, 5, 12])] array([ 2, 2, 3, 5, 12]) 

Этот фильтр возвращает только значения, равные 2, 3, 5 или 12.

Примечание.Полную документацию по функции NumPy in1d() можно найти здесь .

Дополнительные ресурсы

В следующих руководствах объясняется, как выполнять другие распространенные операции фильтрации в Python:

Источник

Фильтр в многомерном массиве python?

и вот как же отфильтровать массив чтобы если в под массиве 2 рой элемент уже есть во 2 ром элементе в каком-то из других подмассивов весь под массив удалялся, сколько думал не додумался до алгоритма.

Что-то типо уникальности всего подмассива но другие поля могут совпадать кроме
array[i][1]

0xD34F

или, с сохранением исходного порядка:

newArr = [ n for n in array if n == next(m for m in array if m[1] == n[1]) ]

0xD34F

zyusifov11, удаления нет нигде, это создание нового массива. И если результат работы не тот - давайте-ка поподробнее: пример данных на входе, что должно получиться на выходе, и что получается реально. А иначе это разговор ни о чём.

0xD34F, значит скажу по подробней это массив состоящий из массивов как в примере мне нужно сделать перепись массива в новый чтобы там были только те строки где 2-ой элемент уникальный среди всех других 2-ых элементов, в вашем способе пишет TypeError: unhashable type: 'list'

0xD34F

zyusifov11, где-то вы явно врёте, девятью часами ранее было "удалил некоторые"/"не удалил ничего", и никакого упоминания TypeError. Как так?

Ничего "по подробней" вы не сказали, всё это есть в тексте вопроса. Вы ещё раз перечитайте мой комментарий выше.

Читайте также:  является единственным обязательным тэгом заголовка и служит для того, чтобы дать документу название. Оно обычно показывается в заголовке окна браузера. Все, что находится между метками и

0xD34F

zyusifov11, это уже сделано. Если не то - значит, вы наврали в тексте вопроса, и вам на самом деле надо что-то другое, или же вы неспособны правильно скопипастить всего одну строку кода. Думайте.

array = [[['h2', 'UNEC', 'Tech', 'https://kabinet.unec.edu.az/en'], ['h2', 'Student’s personal kabinet', 'Tech', 'https://kabinet.unec.edu.az/en'], ['h4', 'Azerbaijan State Economic University', 'Tech', 'https://kabinet.unec.edu.az/en']]]

0xD34F

zyusifov11, попытайтесь найти существенное отличие между тем массивом, что показан в тексте вопроса, и тем, что вы показали сейчас. Не получилось? Протрите глаза и попробуйте ещё. Оно, отличие, есть.

0xD34F

0xD34F

0xD34F

zyusifov11, в тексте вопроса: массив, содержащий в себе массивы строк. В комментарии выше: массив, содержащий в себе массив, который содержит массивы строк. Это что, по-вашему - одно и то же? Нет. То есть, наврали в вопросе, и вместо того, чтобы получить ответ за 20 минут, колупаетесь вторые сутки. Очень умно, ничего не скажешь.

Ладно, показали как ваши данные выглядят на самом деле (если, конечно, опять не наврали). Покажите теперь, каким должен быть результат их фильтрации.

0xD34F, ладно да с кем не бывает ответ должен быть таким же только без массивов в которых 2 ой элемент уже есть тут.

0xD34F

zyusifov11, вижу, слов вы не понимаете. Может, вам на фриланс отправиться? Там вашу тупость будут терпеть куда более охотно - за деньги это нетрудно.

0xD34F, это вы не понимаете говорю на русском что надо получить все тоже только без массивов где повторяются 2 е элементы

array = [ [ ['h2', 'UNEC', 'Tech', 'https://kabinet.unec.edu.az/en'], ['h2', 'Student’s personal kabinet', 'Tech', 'https://kabinet.unec.edu.az/en'], ['h4', 'UNEC', 'Tech', 'https://kabinet.unec.edu.az/en'] ] ] newArray = [ [ ['h2', 'UNEC', 'Tech', 'https://kabinet.unec.edu.az/en'], ['h2', 'Student’s personal kabinet', 'Tech', 'https://kabinet.unec.edu.az/en'] ] ]

Источник

Python NumPy Filter двумерный массив по условию

Это работает нормально, но я где-то читал, что он неэффективен. Каков правильный метод numpy для этого?

Читайте также:  Css ошибка при подключении

Edit:

Спасибо за правильные ответы! К сожалению, я могу отметить только один принятый ответ. Я удивлен, что numpy.in1d не найден в google-поисках для numpy filter 2d array .

4 ответа

Вы можете использовать массив индексов bool , который можно создать с помощью np.in1d . Вы можете индексировать np.ndarray по любому axis , который вы хотите использовать, например, массив bool , указывающий, должен ли элемент быть включенным. Поскольку вы хотите индексировать по axis=0 , что означает, что вы хотите выбрать из индекса outest, вам нужно иметь 1D np.array , длина которого - это количество строк. Каждый из его элементов укажет, следует ли включать строку. Быстрый способ получить это - использовать np.in1d во втором столбце a . Вы получаете все элементы этого столбца на a[:, 1] . Теперь у вас есть 1D np.array , элементы которого должны быть проверены на ваш фильтр. То, что np.in1d для. Таким образом, полный код будет выглядеть так:

import numpy as np a = np.asarray([[2,'a'],[3,'b'],[4,'c'],[5,'d']]) filter = np.asarray(['a','c']) a[np.in1d(a[:, 1], filter)] 
import numpy as np a = np.asarray([[2,'a'],[3,'b'],[4,'c'],[5,'d']]) filter = np.asarray(['a','c']) mask = np.in1d(a[:, 1], filter) a[mask] 
>>> import numpy >>> a = numpy.asarray([[2,'a'],[3,'b'],[4,'c'],[5,'d']]) >>> filter = numpy.array(['a','c']) >>> a[(a[:,1,None] == filter[None,:]).any(axis=1)] array([['2', 'a'], ['4', 'c']], dtype='|S21') 

None в индексе создает одноэлементное измерение, поэтому мы можем сравнить столбец a и строку filter , а затем уменьшить результирующий булев массив

>>> a[:,1,None] == filter[None,:] array([[ True, False], [False, False], [False, True], [False, False]], dtype=bool) 

Хотя решение in1d проще (по крайней мере, при вызове функции), хорошо также понимать и использовать это решение. Это своего рода решение, которое работает во многих других случаях.

Да, я согласен с тем, что решение с in1d лучше. Я не знал о его существовании; даже пытался гуглить "векторизовал" перед ответом, но по какой-то причине не смог ничего найти.

Я посмотрел на код in1d . Я думаю, что в этом случае он строит ту же маску, только итеративно на filter .

Источник

Оцените статью