#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. Однако вместо этого он возвращает генератор, поэтому вам никогда не придется хранить два списка в памяти, что делает код более эффективным.