2013-03-29 3 views
5

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

[[0,1], 
[0,2], 
[0,3], 
[0,4], 
[1,5], 
[1,6], 
[1,7], 
[2,8], 
[2,9]] 

нужно удалить первые элементы каждого подвид данных, как определено в первом столбце. Поэтому сначала я получаю все элементы, которые имеют 0 в первом столбце, и удаляют первую строку: [0,1]. Затем я получаю элементы с 1 в первом столбце и удаляю первую строку [1,5], следующий шаг я удаляю [2,8] и т. Д. И т. Д. В конце концов, я хотел бы иметь набор данных, как это:

[[0,2], 
[0,3], 
[0,4], 
[1,6], 
[1,7], 
[2,9]] 

EDIT: Может ли это быть сделано в NumPy? Мой набор данных очень велик, поэтому для циклов на всех элементах требуется не менее 4 минут.

+0

Что вы пробовали, и где ты застрял? Вы получите больше, лучше ответы на конкретные вопросы, чем общие заявления «пожалуйста, сделайте мою проблему для меня». –

+0

@ Robᵩ Я попытался использовать маски, чтобы получить каждое подвью и удалить строку в подвью, но тогда я не знаю, как удалить строку в исходном наборе данных. Скопирует ли скоро код – siamii

+0

Разве эти сортировки? Итак, вложенные списки с равными значениями в индексе 0 сгруппированы? –

ответ

3

В соответствии с просьбой, numpy решения:

import numpy as np 
a = np.array([[0,1], [0,2], [0,3], [0,4], [1,5], [1,6], [1,7], [2,8], [2,9]]) 
_,i = np.unique(a[:,0], return_index=True) 

b = np.delete(a, i, axis=0) 

(выше отредактировано, чтобы включить @ решения Хайма, вот мое первоначальная маскировка решение ради потомства)

m = np.ones(len(a), dtype=bool) 
m[i] = False 
b = a[m] 

Intere stingly, маска, кажется, быстрее:

In [225]: def rem_del(a): 
    .....:  _,i = np.unique(a[:,0], return_index=True) 
    .....:  return np.delete(a, i, axis = 0) 
    .....: 

In [226]: def rem_mask(a): 
    .....:  _,i = np.unique(a[:,0], return_index=True) 
    .....:  m = np.ones(len(a), dtype=bool) 
    .....:  m[i] = False 
    .....:  return a[m] 
    .....: 

In [227]: timeit rem_del(a) 
10000 loops, best of 3: 181 us per loop 

In [228]: timeit rem_mask(a) 
10000 loops, best of 3: 59 us per loop 
+1

+1 Но, придерживаясь того же общего подхода, не будет ли 'b = np.delete (a, i, axis = 0)' лучше, чем последние три строки? – Jaime

+0

Спасибо @Jaime, я почти прокомментировал, что последний бит, вероятно, имеет лучшую реализацию: P – askewchan

+0

Хотя, @Jaime, маска кажется быстрее? – askewchan

1

Вы хотите использовать itertools.groupby() с тиром itertools.islice() и itertools.chain:

from itertools import islice, chain, groupby 
from operator import itemgetter 

list(chain.from_iterable(islice(group, 1, None) 
         for key, group in groupby(inputlist, key=itemgetter(0)))) 
  • В groupby() группы вызова списка ввода в куски, где первый элемент является одинаковым (itemgetter(0) является ключевой группировкой).
  • Звонок islice(group, 1, None) вызывает группы в итерации, где элемент сначала будет пропущен.
  • Вызов chain.from_iterable() вызывает каждый результат islice() и объединяет их в новый итерируемый, который list() возвращается в список.

Демо:

>>> list(chain.from_iterable(islice(group, 1, None) for key, group in groupby(inputlist, key=itemgetter(0)))) 
[[0, 2], [0, 3], [0, 4], [1, 6], [1, 7], [2, 9]] 
0
a = [[0,1], 
[0,2], 
[0,3], 
[0,4], 
[1,5], 
[1,6], 
[1,7], 
[2,8], 
[2,9]] 

a = [y for x in itertools.groupby(a, lambda x: x[0]) for y in list(x[1])[1:]] 

print a 
0

Мой ответ:

from operator import itemgetter 
sorted(l, key=itemgetter(1)) # fist sort by fist element of inner list 
nl = [] 
[[0, 1], [0, 2], [0, 3], [0, 4], [1, 5], [1, 6], [1, 7], [2, 8], [2, 9]] 
j = 0; 
for i in range(len(l)): 
    if(j == l[i][0]): 
     j = j + 1 # skip element 
    else: 
     nl.append(l[i]) # otherwise append in new list 

выход:

>>> nl 
[[0, 2], [0, 3], [0, 4], [1, 6], [1, 7], [2, 9]] 
2

Pass в списках и ключ, который вы хотитепроверьте значения.

def getsubset(set, index): 
    hash = {} 
    for list in set: 
     if not list[index] in hash: 
      set.remove(list) 
      hash[list[index]] = list 

    return set 
+0

Это быстро, но не нужно «возвращать набор», поскольку это мутирует «set» на месте. – askewchan

Смежные вопросы