2013-03-29 24 views
5

Tôi có một bộ dữ liệu như thế này:xóa phần tử đầu tiên trong subview của một ma trận

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

tôi cần phải xóa các yếu tố đầu tiên của mỗi subview của dữ liệu theo quy định của cột đầu tiên. Vì vậy, đầu tiên tôi nhận được tất cả các phần tử có 0 trong cột đầu tiên và xóa hàng đầu tiên: [0,1]. Sau đó, tôi lấy các phần tử với 1 trong cột đầu tiên và xóa hàng đầu tiên [1,5], bước tiếp theo tôi xóa [2,8], v.v. Cuối cùng, tôi muốn có một bộ dữ liệu như thế này:

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

EDIT: Có thể điều này được thực hiện trong NumPy? Tập dữ liệu của tôi rất lớn nên các vòng lặp trên tất cả các phần tử mất ít nhất 4 phút để hoàn thành.

+0

Bạn đã thử gì và bạn bị kẹt ở đâu? Bạn sẽ nhận được nhiều hơn, tốt hơn, câu trả lời cho các câu hỏi cụ thể hơn là câu nói "xin hãy giải quyết vấn đề của tôi cho tôi" chung. –

+0

@ Robᵩ Tôi đã cố gắng sử dụng các mặt nạ để có được mỗi subview và xóa các hàng trong subview, nhưng sau đó tôi không biết làm thế nào để xóa hàng trong tập dữ liệu gốc. Sẽ đăng mã sớm – siamii

+0

Chúng có được sắp xếp không? Vì vậy, là danh sách lồng nhau với các giá trị bằng nhau tại chỉ số 0 được nhóm lại? –

Trả lời

3

Theo yêu cầu, một giải pháp 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) 

(trên được chỉnh sửa để kết hợp @ giải pháp của Jaime, đây là giải pháp mặt nạ ban đầu của tôi vì lợi ích của hậu thế của)

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

Intere stingly, mặt nạ có vẻ nhanh hơn:

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 Nhưng giữ cùng một cách tiếp cận chung, sẽ không 'b = np.delete (a, i, axis = 0)' là một lựa chọn tốt hơn so với ba dòng cuối cùng? – Jaime

+0

Cảm ơn @Jaime, tôi gần như đã nhận xét để nói rằng bit cuối cùng có thể có triển khai tốt hơn: P – askewchan

+0

Mặc dù, @Jaime, mặt nạ có vẻ nhanh hơn? – askewchan

1

Bạn muốn sử dụng itertools.groupby() với một dấu gạch ngang của 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)))) 
  • Các groupby() nhóm gọi danh sách đầu vào khối nơi mục đầu tiên là như nhau (itemgetter(0) là chìa khóa nhóm).
  • Cuộc gọi islice(group, 1, None) biến nhóm thành các vòng lặp có thể bỏ qua phần tử đầu tiên.
  • Cuộc gọi chain.from_iterable() mất mỗi kết quả islice() và kết nối chúng lại với nhau thành một lần lặp mới, trong đó list() sẽ trở lại danh sách.

Demo:

>>> 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

câu trả lời của tôi là:

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 

đầu ra là:

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

đèo trong danh sách của bạn và quan trọng mà bạn muốn kiểm tra các giá trị trên.

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

Đây là tốc độ nhanh, nhưng không cần phải 'trả lại tập' vì điều này thay đổi' set' tại chỗ. – askewchan

Các vấn đề liên quan