2011-09-08 32 views
38

Tôi phải nhóm các phần tử liên tiếp từ một mảng có nhiều mảng. xem xét ví dụ saucách tìm các nhóm phần tử liên tiếp từ một mảng có dạng khối u?

a = [ 0, 47, 48, 49, 50, 97, 98, 99] 

Sản lượng nên một danh sách các hàng như sau

[(0),(47, 48, 49, 50),(97, 98, 99)] 

đây là sự khác biệt chỉ là một là. giữa phần tử. Nó sẽ là tuyệt vời nếu sự khác biệt cũng có thể được xác định như là một giới hạn hoặc một số cứng mã hóa.

Cảm ơn rất nhiều.

+0

Tôi tìm thấy câu trả lời này có CHÍNH XÁC cùng một vấn đề ... Thế giới nhỏ! : o) – heltonbiker

+0

Bản sao có thể có của [Xác định các nhóm số liên tục trong một danh sách] (http://stackoverflow.com/questions/2154249/identify-groups-of-continuous-numbers-in-a-list) – styvane

+0

Xem thêm: https://stupidpythonideas.blogspot.com/2014/01/grouping-into-runs-of-adjacent-values.html – ShreevatsaR

Trả lời

12

Dưới đây là một func lil có thể giúp:

def group_consecutives(vals, step=1): 
    """Return list of consecutive lists of numbers from vals (number list).""" 
    run = [] 
    result = [run] 
    expect = None 
    for v in vals: 
     if (v == expect) or (expect is None): 
      run.append(v) 
     else: 
      run = [v] 
      result.append(run) 
     expect = v + step 
    return result 

>>> group_consecutives(a) 
[[0], [47, 48, 49, 50], [97, 98, 99]] 
>>> group_consecutives(a, step=47) 
[[0, 47], [48], [49], [50, 97], [98], [99]] 
+2

P.S. Nếu bạn muốn tuple thay vì danh sách, bạn có thể làm 'tuple (map (tuple, group_consecutives (a)))' – dkamins

+0

Cảm ơn điều này phù hợp với nhu cầu của tôi một cách hoàn hảo! – Shan

+3

Đây không phải là giải pháp NumPy! – marscher

0

này nghe có vẻ hơi giống như bài tập về nhà, vì vậy nếu bạn không nhớ, tôi sẽ đề nghị một cách tiếp cận

Bạn có thể lặp lại trên một danh sách sử dụng

for i in range(len(a)): 
    print a[i] 

Bạn có thể kiểm tra phần tử tiếp theo trong danh sách đáp ứng một số tiêu chí thích sau

if a[i] == a[i] + 1: 
    print "it must be a consecutive run" 

Và bạn có thể lưu trữ kết quả riêng rẽ trong

results = [] 

Cẩn thận - có một chỉ số ra khỏi phạm vi lỗi ẩn trong trên, bạn sẽ cần phải đối phó với

+2

Vui lòng không đề xuất sử dụng trình lặp vòng python trên mảng có nhiều mảng khi các giải pháp rõ ràng hơn tồn tại. Nó đánh bại mục đích sử dụng numpy. (thường.) Nếu OP không quan tâm đến hiệu suất, họ có thể đã sử dụng danh sách python. – Paul

6

(a[1:]-a[:-1])==1 sẽ tạo ra một mảng boolean nơi False chỉ ra sự đứt đoạn trong chạy. Bạn cũng có thể sử dụng được xây dựng trong numpy.grad.

+0

giải pháp mát mẻ 1up – Shan

+0

Tôi không hiểu câu trả lời này mặc dù đó là câu trả lời duy nhất có vẻ "chức năng" (như trong ngôn ngữ chức năng). Những gì bạn đang làm ở đây là áp dụng toán tử trừ vào danh sách. Tôi không thấy làm thế nào mà có thể làm việc. –

+2

@LukeSkywalker Nó không hoạt động. 'a' trong trường hợp này là một mảng numpy, không phải là một danh sách và toán tử trừ trừ phép trừ phần tử. – Paul

4

đây là những gì tôi đã đưa ra cho đến nay: không chắc chắn là 100% đúng

import numpy as np 
a = np.array([ 0, 47, 48, 49, 50, 97, 98, 99]) 
print np.split(a, np.cumsum(np.where(a[1:] - a[:-1] > 1))+1) 

lợi nhuận:

>>>[array([0]), array([47, 48, 49, 50]), array([97, 98, 99])] 
+0

giải pháp lạnh 1 lên – Shan

+1

Ví dụ truy cập: a = np.array ([0, 47, 48, 49, 50, 97, 98, 99, 101, 102, 103, 140, 141]) in (np.split (a , np.cumsum (np.where (a [1:] - a [: - 1]> 1)) +1)) tạo [mảng ([0]), mảng ([47, 48, 49, 50]) , mảng ([97, 98, 99, 101, 102, 103, 140]), mảng ([141]), mảng ([], dtype = int64)] – Back2Basics

100
def consecutive(data, stepsize=1): 
    return np.split(data, np.where(np.diff(data) != stepsize)[0]+1) 

a = np.array([0, 47, 48, 49, 50, 97, 98, 99]) 
consecutive(a) 

sản lượng

[array([0]), array([47, 48, 49, 50]), array([97, 98, 99])] 
+1

Tôi không nhận ra 'mảng_split' tồn tại! Đó là khá tiện dụng! Cảm ơn! –

+2

giải pháp mát mẻ 1 lên – Shan

+1

Và để tìm kiếm các chuỗi giống hệt nhau: 'partitions = np.where (a [1:]! = A [: - 1]) [0] + 1' (' np.diff' không làm việc cho dây) – z0r

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