Удаление значений > 0 в наборе данных

#python #python-3.x #list

#python #python-3.x #Список

Вопрос:

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

 [[-0.519418066, -0.680905835],
[0.895518429, -0.654813183],
[0.092350219, 0.135117023],
[-0.299403315, -0.568458405],....]
  

его форма равна (9760,), и я пытаюсь удалить все записи, где значение первого числа в каждой записи больше 0, поэтому в этом примере 2-я и 3-я записи будут удалены, чтобы оставить

 [[-0.519418066, -0.680905835],
[-0.299403315, -0.568458405],....]
  

До сих пор я писал:

 for x in range(9670):
for j in filterfinal[j][0]:
    if filterfinal[j][0] > 0:
        np.delete(filterfinal[j])
  

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

Заранее спасибо за любую помощь в решении этой проблемы!

Комментарии:

1. что вы пробовали — простой способ начать — использовать циклы for, в этом нет ничего плохого. Также StackOverflow не должен быть местом, где за вас пишут код — это место, куда вы приносите код, который вы написали, который не работает, и просите помощи в его исправлении.

2. извините, я не очень долго использую stack overflow, я отредактирую написанный мной код

Ответ №1:

Вы можете использовать numpy логическую индексацию:

 >>> x = np.random.randn(10).reshape((5,2))
array([[-0.46490993,  0.09064271],
       [ 1.01982349, -0.46011639],
       [-0.40474591, -1.91849573],
       [-0.69098115,  0.19680831],
       [ 2.00139248, -1.94348869]])

>>> x[x[:,0] > 0]
array([[ 1.01982349, -0.46011639],
       [ 2.00139248, -1.94348869]])
  

Некоторое объяснение:
x[:,0] выбирает первый столбец вашего массива.
x > 0 вернет массив той же формы, где каждое значение заменяется результатом поэлементного сравнения (т. Е. Является ли значение > 0 или нет?)
Таким образом, x[:,0] > 0 вы получите массив shape (n,1) со True значениями False или, в зависимости от первого значения вашей строки.

Затем вы можете передать этот массив логических значений в качестве индекса в свой исходный массив, где он вернет вам массив только из тех индексов, которые есть True . Передавая логический массив shape (n,1) , вы выбираете каждую строку.

Ответ №2:

Вы говорите о «форме», поэтому я предполагаю, что вы используете numpy. Кроме того, вы упоминаете np в своем примере кода, так что вы можете применять поэлементные операции вместе с логической индексацией

 array = np.array([[-0.519418066, -0.680905835],
                  [0.895518429, -0.654813183],
                  [0.092350219, 0.135117023],
                  [-0.299403315, -0.568458405]])

filtered = array[array[:, 0] < 0]
  

Ответ №3:

Используйте понимание списка:

 lol = [[-0.519418066, -0.680905835],[0.895518429, -0.654813183],[0.092350219, 0.135117023],[-0.299403315, -0.568458405]]

filtered_lol = [l for l in lol if l[0] <= 0]
  

Ответ №4:

Вы можете использовать понимание списка, которое распаковывает первый элемент из каждого вложенного списка и сохраняет только те, у которых первый элемент <= 0 (при условии, что ваш список списков хранится как переменная l ):

 [l for a, _ in l if a <= 0]
  

Ответ №5:

Вы можете пройти через это в цикле for и создать новый список без положительных результатов, например:

 new_list = []
for item in old_list:
    if item[0] < 0:
        new_list.append(item)
  

Но я бы предпочел вместо этого использовать встроенную filter функцию, если вам это удобно, и сделать что-то вроде:

 def is_negative(number):
    return number < 0

filtered_list = filter(is_negative, old_list)
  

Это похоже на понимание списка — или просто использование цикла for. Однако вместо этого он возвращает генератор, поэтому вам никогда не придется хранить два списка в памяти, что делает код более эффективным.