2012-01-24 3 views
2

특정 열에 의해 식별되는 두 개의 데이터 집합의 평균을 계산하려고합니다. 여기는 AA2 란입니다. 간단한 솔루션은 먼저 데이터 세트를 식별 한 다음 해당 데이터 세트에 대한 평균을 계산하는 것입니다. 그러나 이것은 파이썬에서는 좋지 않습니다. numpy가 나를 위해이 일을 할 수있는 방법이 있습니까?numpy를 사용하여 집합의 평균값을 계산하는 더 좋은 방법

내 데이터 세트 :

Number  AA1 AA2 AA3 Atom  amou mean_shift   stddev 
    187   ALA GLU LEU C    1   119.47   0.00 
    187   ALA GLU LEU O    1   8.42   0.00 
    188   ALA GLU LYS C    1   120.67   0.00 
    188   ALA GLU LYS O    1   9.11   0.00 
    777   ARG GLN ARG C    1   117.13   0.00 
    777   ARG GLN ARG O    1   8.48   0.00 

은 내가 원하는 무엇 :

187    GLU C    1  (119.47+120.67+117.13)/3 0.00 
    187    GLU O    1   (8.42+9.11+8.48)/3   0.00 

편집 : 나는 예를 정리. 평균은 열 mean_shift에 대해 계산되지만 원자가 동일한 행에 대해서만 계산됩니다. 이 내 (너무 좋은하지 버전)입니다 :

i,j = 0,0 
# iterate over all keys 
for j in range(1, len(data_one)): 
     key = data_two[j][3] 
     aminoacid = data_two[j][5] 
     print key, aminoacid 
     stop 
     keyeddata=[] 
     for i in range(1, len(data_one)): 
       if (data_one[i][2]==key): 
         keyeddata.append(data_one[i]) 
       print mean(keyeddata[6]) 

환호, 감사

당신은 다음과 같이 구조화 된 배열을 쉽게 할 수
+0

귀하의 질문에 대한 귀하의 질문을 이해하지 못합니다. 여기서 칼럼이 AA2가 아니라고 말하면 처음 4 개의 엔트리는 집합 1 (GLU)에 속하며 마지막 두 개는 집합 2 (GLN)에 속합니다. 그렇다면 귀하의 경우에 '평균'열의 의미가 필요합니까? – Bogdan

+0

원하는 결과를 질문에 연관시키는 데 문제가 있습니다. "AA2를 통한 평균 계산"은 어떻게 모든 GLN 및 GLU/LYS 행이 사라지는 것으로 해석합니까? "사소한 해결책"에 대한 의사 코드를 줄 수 있습니까? 건배. –

+0

당신이 원하는 것이 아직 명확하지 않지만 데이터 셋이 어떤 파이썬 구조로 파싱되지 않기 전에 numpy는 아무 것도 할 수 없습니다. "파이썬에서 멋지지 않아"라는 말은 무엇을 의미합니까?좋은 읽을 수있는 코드를 원한다면 불필요한 내용을 재사용 가능한 클래스로 포장하여 주 코드의 최종 코드가 깨끗하고 읽기 쉬운 상태로 만들 수 있습니다. – Bort

답변

6

:

import numpy as np 

# Test data 
data = [ 
    (187, "ALA","GLU", "LEU", "C", 1, 119.47, 0.00), 
    (187, "ALA","GLU", "LEU", "O", 1, 8.42, 0.00), 
    (188, "ALA","GLU", "LYS", "C", 1, 120.67, 0.00), 
    (188, "ALA","GLU", "LYS", "O", 1, 9.11, 0.00), 
    (777, "ARG","GLN", "ARG", "C", 1, 117.13, 0.00), 
    (777, "ARG","GLN", "ARG", "O", 1, 8.48, 0.00), 
    ] 

# Structure definition 
my_dtype = [ 
    ('Number', 'i4'), 
    ( 'AA1', 'a3'), 
    ( 'AA2', 'a3'), 
    ( 'AA3', 'a3'), 
    ('Atom', 'a1'), 
    ('amou', 'i4'), 
    ('mean', 'f4'), 
    ('stddev', 'f4') 
      ] 

a = np.array(data, dtype = my_dtype) 

을 자, 함께 a 배열을 사용하면 쉽게 그룹을 추출 할 수 있습니다. 먼저 특정 속성에 대한 고유 한 요소를 찾으십시오.

>>> np.unique(a['AA2']) 
array(['GLN', 'GLU'], 
     dtype='|S3') 

이제 속성을 일치시켜 데이터를 그룹화 할 수 있습니다. 예 :

# This gives you a mask 
>>> a['AA2'] == 'GLN' 
array([False, False, False, False, True, True], dtype=bool) 
# that you can apply to the array itself 
>>> a[a['AA2'] == 'GLN'] 
array([(777, 'ARG', 'GLN', 'ARG', 'C', 1, 117.12999725341797, 0.0), 
     (777, 'ARG', 'GLN', 'ARG', 'O', 1, 8.4799995422363281, 0.0)], 
     dtype=[('Number', '<i4'), ('AA1', '|S3'), ('AA2', '|S3'), ('AA3', '|S3'), 
      ('Atom', '|S1'), ('amou', '<i4'), ('mean', '<f4'), ('stddev', '<f4')]) 

거기에서 임의의 계산에 임의의 계산을 적용 할 수 있습니다. 수단의 평균, 말 :

>>> gln = a[a['AA2'] == 'GLN'] 
>>> gln['mean'].mean() 
62.805000305175781 

편집 : 당신은 아마 일부를 수행 할 것입니다

>>> a['Atom'] == 'C' 
array([ True, False, True, False, True, False], dtype=bool) 
>>> np.logical_and(a['Atom'] == 'C', a['AA2'] == 'GLN') 
array([False, False, False, False, True, False], dtype=bool) 

# Which of course would give us the only row that fits: 
>>> a[np.logical_and(a['Atom'] == 'C', a['AA2'] == 'GLN')] 
array([(777, 'ARG', 'GLN', 'ARG', 'C', 1, 117.12999725341797, 0.0)], ...) 

: 지금, 마음에 이전 a['AA2'] == 'GLN' 예를 유지, 하나 개 이상의 기준을 다음과 같은 데이터를 선택합니다 (itertools 또는 유사한 것을 사용하여) 기준에 대한 조합론을 사용하여 프로세스를 자동화하십시오. NumPy에서 사용 가능한 로직 기능을 보려면 here을 보길 원할 수도 있습니다.

+0

thats 실제로 내가 좋은 예제를 위해 +1을 찾고있었습니다. 마스크를 여러 열로 확장하는 방법을 추가 할 수 있습니까? – tarrasch

+0

"행/열"을 여기서는 생각하지 마십시오. 이것은 실제로 1D 배열입니다! 각 요소의 타입은'my_dtype'에 의해 정의 된 것과 같은 구조입니다. 자, 마스크는 단지 boolean 배열입니다. 즉 boolean 연산 (and, or, or xor ...)을 사용할 수 있습니다. 방법을 보여주기 위해 대답을 업데이트 할 것입니다. –

+0

감사합니다, 당신은 내 하루를 만들어 :) – tarrasch

3

팬더를 확인 했습니까? 그것은 numpy 위에 구축되었으며 레이블이있는 데이터를 처리하기위한 몇 가지 아주 좋은 기능을 가지고 있습니다.

http://pandas.sourceforge.net/

관련 문제