문제

나는 그냥을 시작으로 NumPy 그래서 내가 누락 될 수 있습니다 몇 가지 핵심 개념을...

최선의 방법은 무엇일을 만들 NumPy 배열을 사전에서 그 값은 나열?

무언가 이것을 좋아한다:

d = { 1: [10,20,30] , 2: [50,60], 3: [100,200,300,400,500] }

는 다음과 같습니다.

data = [
  [10,20,30,?,?],
  [50,60,?,?,?],
  [100,200,300,400,500]
]

나는 몇 가지 기본적인 통계 각 행에,예를 들어:

deviations = numpy.std(data, axis=1)

질문:

  • 무엇 최/는 가장 효율적인 방법을 만들 numpy.배열을 사전에서?사전 큰;몇 백만 키를 가진 각~20 항목입니다.

  • 의 숫자 값에 대한 각각의 행은 다릅니다.내가 제대로 이해한다면 numpy 원하는 균일한 크기,그래서 나는 무엇을 채우기에서 누락된 항목을 확인 std()행복한가?

업데이트:하나 언급하는 것을 잊었다면 python 기술은 합리적인(예를 들어.반복 몇 백만 이상 항목을 빠르다),그것의 제한된 하나의 CPU.Numpy 작업 확장 잘 하드웨어와 모든 Cpu,그래서 그들은 매력적이다.

도움이 되었습니까?

해결책

을 만들 필요가 없 numpy 배열 전화 numpy.std().당신을 호출 할 수 있습 numpy.std()루프에서 이상의 모든 값의 사전입니다.목록으로 변환됩니다 numpy 배열에 비행을 계산하는 표준이다.

의 단점은 이 방법은 메인 루프에서는 파이썬과하지 않 C.그러나 내 생각이 있어야 충분히 빠르다:당신은 여전히 계산 std C 속도,그리고 당신은 메모리를 많이 저장지 않으므로 저장해야 0 값을 수 있는 변수 크기는 배열입니다.

  • 하려면을 최적화,저장할 수 있습니다 당신의 값으로 목록 numpy 어레이,그래서 당신이하는 파이썬 목록->numpy 배열 변환습니다.
  • 을 찾을 경우에는 이것은 아직 너무 느리게 사용하려고,심리를 최적화하는 파이썬다.
  • 는 경우 이것은 아직 너무 느리게,을 사용하여 시험 Cython 과 함께 numpy 모듈이 있습니다.이 튜토리얼 클레임 속도로 인상적인 개선을 위한 이미지를 처리합니다.또는 단순히 프로그램 전 std 기능에 Cython(참조하십시오 에 대한 벤치마크하고 예으로 합계 기능)
  • 대 Cython 사용하는 것입 numpy.나.
  • 하려는 경우에만 사용하 numpy 고 모든 계산 C 수준에서도 그룹의 모든 레코드와 같은 크기에 함께 다른 어레이와 통화 numpy.std()에습니다.그것은 다음과 같이 표시되어야 합니다 예입니다.

예 O(N)복잡:

import numpy
list_size_1 = []
list_size_2 = []
for row in data.itervalues():
    if len(row) == 1:
      list_size_1.append(row)
    elif len(row) == 2:
      list_size_2.append(row)
list_size_1 = numpy.array(list_size_1)
list_size_2 = numpy.array(list_size_2)
std_1 = numpy.std(list_size_1, axis = 1)
std_2 = numpy.std(list_size_2, axis = 1)

다른 팁

여기에는 이미 꽤 합리적인 아이디어가 있지만 다음은 언급 할 가치가 있다고 생각합니다.

기본값으로 누락 된 데이터를 채우면 통계적 특성 (STD 등)이 손상됩니다. 분명히 그것이 Mapad가 동일한 크기의 레코드를 그룹화하는 좋은 트릭을 제안한 이유입니다. 그것의 문제 (레코드 길이에 대한 선험적 데이터가 없다고 가정 함)는 간단한 솔루션보다 훨씬 더 많은 계산이 포함된다는 것입니다.

  1. 적어도 O (n*logn) 효과적인 알고리즘으로 정렬하기위한 'Len'호출 및 비교
  2. 켜짐) 목록을 통해 두 번째 방식으로 검사하여 그룹을 얻습니다 ( '수직'축의 시작 및 끝 인덱스)

psyco를 사용하는 것은 좋은 생각입니다 (사용하기 쉽기 때문에 시도해보십시오).

최적의 방법은 Bullet #1에서 Mapad가 묘사 한 전략을 취하는 것이지만 전체 목록을 생성하는 것이 아니라 각 행을 numpy.array로 변환하고 필요한 계산을 수행하는 사전을 통해 반복하는 것 같습니다. 이와 같이:

for row in data.itervalues():
    np_row = numpy.array(row)    
    this_row_std = numpy.std(np_row)
    # compute any other statistic descriptors needed and then save to some list

어쨌든 파이썬의 수백만 루프는 예상만큼 오래 걸리지 않습니다. 이 외에도 일상적인 계산처럼 보이지 않으므로 한 번 또는 한 번만 실행되면 추가로 2 초가 걸리면 누가 관심이 있습니다.


Mapad가 제안한 것의 일반화 된 변형 :

from numpy import array, mean, std

def get_statistical_descriptors(a):
    if ax = len(shape(a))-1
    functions = [mean, std]
    return f(a, axis = ax) for f in functions


def process_long_list_stats(data):
    import numpy

    groups = {}

    for key, row in data.iteritems():
        size = len(row)
        try:
            groups[size].append(key)
        except KeyError:
            groups[size] = ([key])

    results = []

    for gr_keys in groups.itervalues():             
        gr_rows = numpy.array([data[k] for k in gr_keys])       
        stats = get_statistical_descriptors(gr_rows)                
        results.extend( zip(gr_keys, zip(*stats)) )

    return dict(results)

Numpy 사전

구조화 된 배열을 사용하여 사전과 같은 키로 낭비가 많은 물체를 해결할 수있는 기능을 유지할 수 있습니다.

import numpy as np


dd = {'a':1,'b':2,'c':3}
dtype = eval('[' + ','.join(["('%s', float)" % key for key in dd.keys()]) + ']')
values = [tuple(dd.values())]
numpy_dict = np.array(values, dtype=dtype)

numpy_dict['c']

이제 출력됩니다

array([ 3.])
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top