2010-08-23 3 views
1

이 질문에 poisson과 함께 태그를 붙였습니다.이 경우 도움이되는지 확실하지 않습니다.Python : 특정 범위에 속하는 항목 수를 기반으로 목록에서 배포판을 만듭니다.

데이터 목록에서 배포본 (이미지는 결국 이미지로 포맷 됨)을 만들어야합니다. 예를 들어

: 데이터가 시각 분포를 만들 수 있다는

data = [1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 10, 10, 10, 22, 30, 30, 35, 46, 58, 59, 59] 

등. 예를 들어,이 경우 범위가 10이고 각 범위에서 적어도 3 개의 항목이 유효한 포인트가되어야한다고 말할 수 있습니다. I는 범위 0-9, 10-19, 30-39 및 50-59에> 3 개 항목이 때문에

이 예 데이터와, I는 결과

ditribution = [1, 2, 4, 6] 

유사 할 것으로 예상한다. 이 결과를 사용하여 최종 배포본에 존재하는 섹션이 세분화 된 이미지 (어두운 색)를 생성 할 수있었습니다. 아래에서 볼 수있는 이미지 유형의 예제를 볼 수 있으며 더 많은 데이터가 생성되었을 것입니다. 지금은 파란색 선을 무시하십시오.

나는 목록에있는 모든 항목을 통해 반복하고 같은 내 계산을하는 이것을 무력 방법을 수행하는 방법을 알고있다. 그러나 제 데이터 세트에는 수십만, 심지어 수백만 개의 숫자가있을 수 있습니다. 내 범위 (10)와 필요한 항목 수 (3)는 실제 사례에서 훨씬 더 클 것입니다. 어떤 도움

distribution image

감사합니다. 정렬되지 않습니다

import itertools as it 

d = [k+1 for k, L in 
     ((k, len(list(g))) for k, g in it.groupby(data,key=lambda x:x//10)) 
    if L>=3] 

data 경우, 또는 당신이 모르는 경우, itertools.groupby에 첫 번째 인수로 sorted(data)를 사용하는 대신 단지 :

+0

입력 데이터가 항상 정렬되어 있습니까? –

+0

훈련받지 않은 눈에 보면 이것은 'numpy'의 경우와 같습니다. 당신은 아마 더 잘 알고 있습니다 :) –

+0

이것은 숙제 문제입니까? – txwikinger

답변

4

data 항상 분류되는 경우, 컴팩트 한 방법 일 수 있습니다 data.

밀도가 낮거나 컴팩트 한 방법을 선호하는 경우 물론이를 확장 할 수 있습니다 (예 : 로 : 어느 경우

def divby10(x): return x//10 

distribution = [] 
for k, g in it.groupby(data, key=divby10): 
    L = len(list(g)) 
    if L < 3: continue 
    distribution.append(k+1) 

,기구는 제 groupby가 호출 각 항목의 "키"를 획득하기 위해, 첫 번째 인수로서 전달 된 반복 가능한 각 항목에 key=로 전달 적용이고; 동일한 "키"를 가진 연속 된 각 항목 그룹에 대해 groupby은 키의 값과 해당 그룹의 모든 항목에 대한 반복 가능한 항목이있는 튜플을 생성합니다.

여기에서 키는 항목을 10으로 나눈 값입니다 (잘림 포함). len(list(g))은 해당 "키"가있는 연속 항목 수입니다. 항목이 연속적이어야하므로 정렬 할 데이터가 필요합니다. "값을 10으로 나눈 값"으로 정렬하는 것보다 정렬하는 것이 더 간단합니다 (;-).

0

일부 히스토그램 형식의 작업처럼 들립니다. 이 작업을 수행하기 위해 사전 정렬이 필요하지 않습니다. 주변 요소를 그룹화하기 위해 버킷 정렬 변형을 사용하는 방법에 대해 설명합니다.이 알고리즘은 용도에 맞게 조정해야하지만 here입니다.당신은 매우 길어질 수 있습니다 data 때문에 히스토그램

2

를 형성하기 위해 버킷의 숫자 자체를 저장할 필요는 없습니다, 당신은 numpy을 사용하여 조사 할 수 있습니다. 숫자 작업에 유용한 많은 기능을 제공합니다. 파이썬리스트 [*]보다 numpy 배열에 data을 저장하는 데 더 적은 메모리가 필요하며 많은 numpy 함수가 후드에서 C 함수를 호출하기 때문에 일부를 얻을 수 있습니다 속도 이득 :

import numpy as np 

data = np.array([1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 10, 10, 10, 22, 30, 30, 35, 46, 58, 59, 59]) 

hist,bins=np.histogram(data,bins=np.linspace(0,60,7)) 
print(hist) 
# [11 3 1 3 1 3] 

distribution=np.where(hist>=3)[0]+1 
print(distribution) 
# [1 2 4 6] 

[*] - 참고 : 위의 코드에서, 파이썬 data리스트를 형성하는 과정에서 형성된다. 따라서 여기에서 최대 메모리 요구 사항은 실제로 파이썬 목록을 사용한 경우보다 큽니다. 그러나 파이썬 목록에 대한 다른 참조가 없다면 메모리는 해제되어야합니다. 또는 데이터가 디스크에 저장되어있는 경우 numpy.loadtxt을 사용하여 numpy 배열로 직접 읽을 수 있습니다.

관련 문제