2016-10-11 4 views
1

인덱스 목록 (list (int))과 합계 인덱스 목록 (list (list) int)이 있습니다 .2 차원 numpy 배열이 주어지면 인덱스의 합을 찾아야합니다. 각 열에 대한 두 번째 목록 및 첫 번째 열에서 해당 인덱스에 추가이 벡터화 할 수있는 방법이 있나요 다음은 정상적인 코드 :인덱스 위로 넘김 벡터화 합계

indices = [1,0,2] 
summing_indices = [[5,6,7],[6,7,8],[4,5]] 
matrix = np.arange(9*3).reshape((9,3)) 
for c,i in enumerate(indices): 
    matrix[i,c] = matrix[summing_indices[i],c].sum()+matrix[i,c] 

답변

2

여기 np.add.reduceat 사용하여 거의 * 벡터화 된 접근 방식 -

가.?
lens = np.array(map(len,summing_indices)) 
col = np.repeat(indices,lens) 
row = np.concatenate(summing_indices) 
vals = matrix[row,col] 
addvals = np.add.reduceat(vals,np.append(0,lens.cumsum()[:-1])) 
matrix[indices,np.arange(len(indices))] += addvals[indices.argsort()] 

일부 설정이 있음을 유의하십시오. 오버 헤드이므로 열을 따라 반복 할 때 좋은 수의 열이있는 2D 입력 배열에 가장 적합합니다.

* : 거의 시작 부분에 map()이 사용되었지만 계산 상 무시할 수 있어야합니다.

+0

오류 : TypeError : 두 번째 줄의 'safe'규칙 에 따라 dtype ('O')에서 dtype ('int64')으로 배열 데이터를 캐스팅 할 수 없습니다. lens = np.array (list (map (len (summing_indices))) ? – Aditya369

+0

@ Aditya369로 작성 하시겠습니까? – Divakar

+0

나에게 준다 TypeError : int() 인수는 문자열, 바이트와 같은 객체 또는 숫자 여야하며 'map'이 아니어야합니다. – Aditya369