2015-01-27 2 views
2

배열의 첫 번째 열 값이 동일한 경우 두 번째 열 값을 합계하려면 어떻게합니까?배열의 동일한 값을 합하는 방법

예 : 배열이 [0,1],[1,1],[1,2],[2,5],[2,6] 인 경우 결과는 [0,1],[1,3],[2,11]이어야합니다.

제 경우에는 차이가 나는 경우 엔 감미로운 배열을 사용하고 있습니다.

+0

더 자세히 설명해 주시겠습니까? 어떻게 작성했는지 결과를 얻으십니까? –

+0

첫 번째 열이 정렬되어 있다고 가정 할 수 있습니까? 또는 적어도 같은 (첫 번째 열) 키 값 그룹으로 그룹화 되었습니까? – smci

+0

@smci 예 첫 번째 열이 정렬 된 것으로 가정 할 수 있습니다. – user1361488

답변

2
import numpy as np 

a = np.array([[0, 1], 
       [1, 1], 
       [1, 2], 
       [2, 5], 
       [2, 6]]) 

d = {} 
for k, v in a: 
    d[k] = d.get(k, 0) + v 

b = np.array(d.items()) 

반환

b = np.array([[ 0, 1], 
       [ 1, 3], 
       [ 2, 11]]) 

또는 하나의 라인

다음
from collections import Counter 
b = np.array(sum((Counter({k:v}) for k,v in a), Counter()).items()) 
+1

'카운터 ({k, v는 k에 대해)}'는 ([(0, 1), (1,2), (2, 6)]'를 반환 할 것이고, 필요하지 않은 것이지 – stalk

1

는 NumPy와없는 한 줄 솔루션입니다 (하지만 내장 사용 itertools) :

>>> from itertools import groupby, imap 
>>> arr = [[0, 1], [1, 1], [1, 2], [2, 5], [2, 6]] 

>>> [[k, sum(imap(lambda x: x[1], g))] for (k, g) in groupby(sorted(arr), lambda x: x[0])] 
[[0, 1], [1, 3], [2, 11]] 
+0

내가 좋아한다. 그것. 매우 파이썬. – Joren

+0

정말 필요하지 않을 때 데이터를 정렬하는 아이디어가 마음에 들지 않습니다. 속도가 중요한 경우 선형 시간으로 동일한 목표를 달성해야합니다. –

+0

@ user2560053 OP는 첫 번째 열이 정렬되었다고 가정 할 수 있음을 확인했습니다. – smci

2

첫 번째 항목이 실제로 a이기 때문에 사전을 사용할 수 있습니다. 키 : NumPy와 스마트 색인 사용

l=[ [0,1],[1,1],[1,2],[2,5],[2,6] ] 
s={} 
for e in l: 
    if e[0] in s: s[e[0]] += e[1] 
    else s[e[0]] = e[1] 
0

: 당신은, (깎아 지른듯한 인성에 대한 내 마음에 드는 Counter(chain.from_iterable([k] * v for k,v in myarray)).items()을 것) 한 라이너를 얻을 수있는 가장 읽을 수있는 재미 트릭의 모든 종류를 재생할 수 있지만

[[k,np.sum(x[x[:,0]==k][:,1])] for k in np.unique(x[:,0])] 
0

및 아마도 가장 효율적인 방법은 defaultdict와 명시적인 루프를 사용하는 것입니다.

from itertools import defaultdict 

count = defaultdict(int) 
for k,v in myarray: 
    count[k] += v 

print(list(count.items())) 
관련 문제