Удаление значений> 0 в наборе данных - PullRequest
0 голосов
/ 04 марта 2019

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

[[-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: индексы списка должны быть целыми или кусочками, а не списком

Заранее благодарим за любую помощь по этой проблеме!

Ответы [ 5 ]

0 голосов
/ 04 марта 2019

Вы можете использовать логическое индексирование 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 даст вам массив формы (n,1) с True или False значений в зависимости от первого значения вашей строки.

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

0 голосов
/ 04 марта 2019

Вы говорите о "фигуре", поэтому я предполагаю, что вы используете 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]
0 голосов
/ 04 марта 2019

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

[l for a, _ in l if a <= 0]
0 голосов
/ 04 марта 2019

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

0 голосов
/ 04 марта 2019

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

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...